SQLに「LIKE」と「IN」の組み合わせはありますか?


340

SQLでは、(悲しいことに)LIKEデータベースが正規化のほぼすべての規則に違反しているため、「」条件を使用する必要があります。今は変更できません。しかし、それは問題とは無関係です。

さらに、WHERE something in (1,1,2,3,5,8,13,21)SQLステートメントの可読性と柔軟性を向上させるような条件をよく使用します。

複雑な副選択を書かずにこれら2つを組み合わせるための可能な方法はありますか?

WHERE something LIKE ('bla%', '%foo%', 'batz%')これの代わりに簡単なものが欲しい:

WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'

ここではSQl ServerとOracleを使用していますが、どのRDBMSでもこれが可能かどうか興味があります。


1
AND(AND LIKE '%thing%' or something LIKE '%thing%' or something LIKE '%thing%')
Cosmic Hawk

私たちはTeradataの者の持っていた希望like any/ like allstackoverflow.com/questions/40475982/sql-like-any-vs-like-allを。(記録のために、これはOracle Community Ideasフォーラムcommunity.oracle.com/ideas/11592でリクエストされています)
William Robertson

回答:


196

SQLではLIKEとINの組み合わせはなく、TSQL(SQL Server)またはPLSQL(Oracle)でははるかに少なくなっています。その理由の一部は、全文検索(FTS)が推奨される代替策であるためです。

OracleとSQL ServerのFTS実装はどちらもCONTAINSキーワードをサポートしていますが、構文はまだ少し異なります。

Oracle:

WHERE CONTAINS(t.something, 'bla OR foo OR batz', 1) > 0

SQLサーバー:

WHERE CONTAINS(t.something, '"bla*" OR "foo*" OR "batz*"')

クエリを実行する列には、フルテキストインデックスが作成されている必要があります。

参照:


11
こんにちは。Oracleでは、「CONTAINS」演算子を適用する列にプレーンテキストインデックスを作成する必要があります。データ量によっては、かなり長くなる場合があります。
Pierre-Gilles Levallois 2012

18
SQL Server(少なくとも2008バージョン)では、@ Piloozのコメントも適用されるため、フルテキストインデックスを構築する必要があります。
マルセル

最大長は4000です。
ᴍᴀᴛᴛʙᴀᴋᴇʀ

59

ステートメントを読みやすくするには、REGEXP_LIKE(Oracleバージョン10以降で使用可能)を使用できます。

テーブルの例:

SQL> create table mytable (something)
  2  as
  3  select 'blabla' from dual union all
  4  select 'notbla' from dual union all
  5  select 'ofooof' from dual union all
  6  select 'ofofof' from dual union all
  7  select 'batzzz' from dual
  8  /

Table created.

元の構文:

SQL> select something
  2    from mytable
  3   where something like 'bla%'
  4      or something like '%foo%'
  5      or something like 'batz%'
  6  /

SOMETH
------
blabla
ofooof
batzzz

3 rows selected.

そして、REGEXP_LIKEを使用した簡単なクエリ

SQL> select something
  2    from mytable
  3   where regexp_like (something,'^bla|foo|^batz')
  4  /

SOMETH
------
blabla
ofooof
batzzz

3 rows selected.

だが ...

あまり良くないパフォーマンスのため、私はそれを私はお勧めしません。私はいくつかのLIKE述語を使い続けます。したがって、例は面白さのためだけのものでした。


4
10gでのREGEXPの使用法の素晴らしいイラストを+1。ただし、パフォーマンスが本当にそれほど悪くなるかどうかは知りたいです。両方とも、テーブル全体またはインデックススキャン、あるいはその両方が必要になります。
DCookie

12
そうだね。しかし、正規表現はI / Oではなく、狂ったようにCPUを燃やします。それがさらに悪い場合は、式のリストの大きさや、列にインデックスが付けられているかどうかなどによって異なります。これは単なる警告であり、元のポスターが実装を開始したときに驚くことはありません。
Rob van Wijk

49

あなたは立ち往生しています

WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'

一時テーブルにデータを入力して(ワイルドカードをデータに含める)、次のように結合しない限り:

FROM YourTable                y
    INNER JOIN YourTempTable  t On y.something LIKE t.something

それを試してください(SQL Server構文を使用):

declare @x table (x varchar(10))
declare @y table (y varchar(10))

insert @x values ('abcdefg')
insert @x values ('abc')
insert @x values ('mnop')

insert @y values ('%abc%')
insert @y values ('%b%')

select distinct *
FROM @x x
WHERE x.x LIKE '%abc%' 
   or x.x LIKE '%b%'


select distinct x.*  
FROM @x             x
    INNER JOIN  @y  y On x.x LIKE y.y

出力:

x
----------
abcdefg
abc

(2 row(s) affected)

x
----------
abc
abcdefg

(2 row(s) affected)

OK、これでうまくいきますが、SQLステートメントをより読みやすくするという私の意図した方向にはいきません:)
selfawaresoup

10
SQLでは、インデックスの使用法とパフォーマンスを求めます。SQLを読みやすくするためにインデントとネーミングのみを使用します。読みやすくするために他の変更を加える場合は、実行プランを変更するリスクがあります(これはインデックスの使用とパフォーマンスに影響します)。注意しない場合は、ささいな変更を加えるだけで、瞬時に実行されるクエリを非常に遅いクエリに簡単に変更できます。
和基。

この回答の最初のステートメントが重要です-(ほとんど?)SQLベースのシステムと言語は、回避策を実装することなしに、必要なものをサポートしません。(SQLサーバーでは、フルテキストインデックス作成は役に立ちますか?)
フィリップケリー

@Philip Kelley、SQL Serverのフルテキストインデックス処理はLIKE 'bla%' 、OPのサンプルコードで可能ですか?またはLIKE '%bla%'検索のみを行うことができますか?
和基。

正直なところ、FTインデックスを使用したことがありません。既に製品に含まれている可能性のある回避策のサンプルとしてそれを投げました。彼は(AまたはBまたはC)をやっている何のために、私は疑う、それはそれをしない、それがこれを決定するために多くの労力を取り、その外側の彼の元の質問の範囲は(ないことを知っているだろうとかなり確信していますSQLはそれをネイティブで行います)。
フィリップケリー

20

PostgreSQLにはANYor ALLフォームがあります:

WHERE col LIKE ANY( subselect )

または

WHERE col LIKE ALL( subselect )

ここで、副選択は正確に1列のデータを返します。


1
あるLIKE ANYLIKE ALL、すべてのSQL方言に方言にコア言語、または特定のすなわち一部共通?
アサドエブラヒム2015年

1
@AssadEbrahim、特定ではありません。Oracleは、持っている= ANYか、<> ALLそれが例えばないPLSQLで、唯一のSQLで動作します。
Benoit

私はこれが標準の構文(ではなく、多くのDBMSはそれを実装している)だと思う
ypercubeᵀᴹ

postgresについては、stackoverflow.com
questions / 2245536 /…を

13

別の解決策は、どのRDBMSでも機能するはずです。

WHERE EXISTS (SELECT 1
                FROM (SELECT 'bla%' pattern FROM dual UNION ALL
                      SELECT '%foo%'        FROM dual UNION ALL
                      SELECT 'batz%'        FROM dual)
               WHERE something LIKE pattern)

1
しかし、それは一連のORステートメントよりも醜いです
Fandango68

1
Fandango68 @ますが、選択の労働組合は、テーブル等のようなパターンの別のソース、ビュー、置き換えることができ
MIK

10

上記の内部結合または一時テーブルの手法をカプセル化する場合は、TableValueユーザー関数を使用することをお勧めします。これにより、もう少し明確に読み取ることができます。

http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspxで定義されている分割関数を使用した後

私が作成した "Fish"(int id、varchar(50)Name)というテーブルに基づいて、次のように書くことができます

SELECT Fish.* from Fish 
    JOIN dbo.Split('%ass,%e%',',') as Splits 
    on Name like Splits.items  //items is the name of the output column from the split function.

アウトプット

1低音
2パイク
7アングラー
8スケトウダラ

1
一度に多くの条件に一致すると、行が複製されます。
mik、

7

1つの方法は、条件を一時テーブル(またはSQL Serverのテーブル変数)に保存し、次のように結合することです。

SELECT t.SomeField
FROM YourTable t
   JOIN #TempTableWithConditions c ON t.something LIKE c.ConditionValue

一度に多くの条件に一致すると、行が複製されます。
mik、

7

代わりに内部結合を使用します。

SELECT ...
FROM SomeTable
JOIN
(SELECT 'bla%' AS Pattern 
UNION ALL SELECT '%foo%'
UNION ALL SELECT 'batz%'
UNION ALL SELECT 'abc'
) AS Patterns
ON SomeTable.SomeColumn LIKE Patterns.Pattern

1
まあ、それはまさに私が避けたいことです。動作しますが。
selfawaresoup

なぜこのソリューションを避けるのですか?受け入れられているソリューションと同じ速さで機能し、用途も同じです。
フィルファクター

3
@PhilFactorこのソリューションでは、重複した行を作成できます。
Jakub Kania 2015

5

ここではSQl ServerとOracleを使用していますが、どのRDBMSでもこれが可能かどうか興味があります。

TeradataはLIKE ALL / ANY構文をサポートします。

ALL リスト内のすべての文字列。
ANY 、リスト内の任意の文字列。

┌──────────────────────────────┬────────────────────────────────────┐
      THIS expression         IS equivalent to this expression  
├──────────────────────────────┼────────────────────────────────────┤
 x LIKE ALL ('A%','%B','%C%')  x LIKE 'A%'                        
                               AND x LIKE '%B'                    
                               AND x LIKE '%C%'                   
                                                                  
 x LIKE ANY ('A%','%B','%C%')  x LIKE 'A%'                        
                               OR x LIKE '%B'                     
                               OR x LIKE '%C%'                    
└──────────────────────────────┴────────────────────────────────────┘

編集:

jOOQバージョン3.12.0はその構文をサポートしています。

合成[NOT] LIKE ANYおよび[NOT] LIKE ALL演算子を追加します

多くの場合、SQLユーザーは次のようにLIKE述語とIN述語を組み合わせることができることを望んでいます。

SELECT *
FROM customer
WHERE last_name [ NOT ] LIKE ANY ('A%', 'E%') [ ESCAPE '!' ]

回避策は、述語を同等のものに手動で拡張することです

SELECT *
FROM customer
WHERE last_name LIKE 'A%'
OR last_name LIKE 'E%'

jOOQは、そのような合成述語をそのまま使用できます。


PostgreSQL LIKE/ILIKE ANY (ARRAY[])

SELECT *
FROM t
WHERE c LIKE ANY (ARRAY['A%', '%B']);

SELECT *
FROM t
WHERE c LIKE ANY ('{"Do%", "%at"}');

db <> fiddleデモ


Snowflakeは、LIKE ANY / LIKE ALLマッチングもサポートしています。

LIKE ANY / ALL

1 つ以上のパターンとの比較に基づいて、大文字と小文字を区別した文字列の照合を許可します。

<subject> LIKE ANY (<pattern1> [, <pattern2> ... ] ) [ ESCAPE <escape_char> ]

例:

SELECT * 
FROM like_example 
WHERE subject LIKE ANY ('%Jo%oe%','T%e')
-- WHERE subject LIKE ALL ('%Jo%oe%','J%e')

4

あなたもこれを試すことができます

関数

CREATE  FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20))
RETURNS @Strings TABLE
(   
  position int IDENTITY PRIMARY KEY,
  value varchar(8000)  
)
AS
BEGIN

DECLARE @index int
SET @index = -1

WHILE (LEN(@text) > 0)
  BEGIN 
    SET @index = CHARINDEX(@delimiter , @text) 
    IF (@index = 0) AND (LEN(@text) > 0) 
      BEGIN  
        INSERT INTO @Strings VALUES (@text)
          BREAK 
      END 
    IF (@index > 1) 
      BEGIN  
        INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))  
        SET @text = RIGHT(@text, (LEN(@text) - @index)) 
      END 
    ELSE
      SET @text = RIGHT(@text, (LEN(@text) - @index))
    END
  RETURN
END

クエリ

select * from my_table inner join (select value from fn_split('ABC,MOP',','))
as split_table on my_table.column_name like '%'+split_table.value+'%';

4

私は単純な解決策を持っています。それは少なくともpostgresqlで機能しlike any、正規表現のリストを続けて使用します。リストにある抗生物質を特定する例を示します。

select *
from database.table
where lower(drug_name) like any ('{%cillin%,%cyclin%,%xacin%,%mycine%,%cephal%}')

3

私もそのようなことを考えていました。私はちょうどの組み合わせを使用してテストSUBSTRINGしてIN、それがこの種の問題のための効果的なソリューションです。以下のクエリを試してください:

Select * from TB_YOUR T1 Where SUBSTRING(T1.Something, 1,3) IN ('bla', 'foo', 'batz')

1
このアプローチの1つの問題は、あなたはそれが存在する場合t1.somethingにインデックスを使用する能力を失う..です
靴紐

1
これは決して 'batz'を見つけることはありません
mik

3

Oracleの次の方法でコレクションを使用することができます。

WHERE EXISTS (SELECT 1
                FROM TABLE(ku$_vcnt('bla%', '%foo%', 'batz%'))
               WHERE something LIKE column_value)

ここでは定義済みのコレクション型を使用してku$_vcntいますが、次のように独自のコレクション型を宣言できます。

CREATE TYPE my_collection AS TABLE OF VARCHAR2(4000);

2

SQL Serverの場合は、動的SQLを使用できます。

このような状況では、ほとんどの場合、データベースの一部のデータに基づいてIN句のパラメーターがあります。

以下の例は少し「強制的な」ものですが、これはレガシーデータベースにある実際のさまざまなケースに一致します。

個人名がFirstName + '' + LastNameとして単一のフィールドPersonNameに格納されているテーブルPersonsがあるとします。テーブルNamesToSelectのフィールドNameToSelectに格納されている名のリストから、すべての人物を選択する必要があります。さらに、いくつかの追加基準(性別、生年月日などでフィルタリングされている)を選択する必要があります。

次のように行うことができます

-- @gender is nchar(1), @birthDate is date 

declare 
  @sql nvarchar(MAX),
  @subWhere nvarchar(MAX)
  @params nvarchar(MAX)

-- prepare the where sub-clause to cover LIKE IN (...)
-- it will actually generate where clause PersonName Like 'param1%' or PersonName Like 'param2%' or ...   
set @subWhere = STUFF(
  (
    SELECT ' OR PersonName like ''' + [NameToSelect] + '%''' 
        FROM [NamesToSelect] t FOR XML PATH('')
  ), 1, 4, '')

-- create the dynamic SQL
set @sql ='select 
      PersonName
      ,Gender
      ,BirstDate    -- and other field here         
  from [Persons]
  where 
    Gender = @gender
    AND BirthDate = @birthDate
    AND (' + @subWhere + ')'

set @params = ' @gender nchar(1),
  @birthDate Date'     

EXECUTE sp_executesql @sql, @params,    
  @gender,  
  @birthDate

2

私にはこれに対する解決策があるかもしれませんが、私の知る限り、SQL Server 2008でしか機能しません。https://stackoverflow.com/a/7285095/894974で説明されているrow-constructor を使用して、like句を使用して「架空の」テーブルを結合できることを発見しました。それはそれよりも複雑に聞こえます、見てください:

SELECT [name]
  ,[userID]
  ,[name]
  ,[town]
  ,[email]
FROM usr
join (values ('hotmail'),('gmail'),('live')) as myTable(myColumn) on email like '%'+myTable.myColumn+'%' 

これにより、リストで提供されているような電子メールアドレスを持つすべてのユーザーが作成されます。それが誰にとっても役に立つことを願っています。問題はしばらく私を悩ませていました。


1
それは面白い。ただし、likeステートメントではインデックスを使用できないため、これは小さいテーブルでのみ使用する必要があることに注意してください。そのため、データが大量にある場合は、最初から設定するのは困難ですが、全文検索が適しています。
HLGEM 2013

2

2016年以降、SQL ServerにはSTRING_SPLIT 関数が含まれています。私はSQL Server v17.4を使用していますが、これでうまくいきました。

DECLARE @dashboard nvarchar(50)
SET @dashboard = 'P1%,P7%'

SELECT * from Project p
JOIN STRING_SPLIT(@dashboard, ',') AS sp ON p.ProjectNumber LIKE sp.value


1

これはカンマ区切りの値で機能します

DECLARE @ARC_CHECKNUM VARCHAR(MAX)
SET @ARC_CHECKNUM = 'ABC,135,MED,ASFSDFSF,AXX'
SELECT ' AND (a.arc_checknum LIKE ''%' + REPLACE(@arc_checknum,',','%'' OR a.arc_checknum LIKE ''%') + '%'')''

次のように評価します。

 AND (a.arc_checknum LIKE '%ABC%' OR a.arc_checknum LIKE '%135%' OR a.arc_checknum LIKE '%MED%' OR a.arc_checknum LIKE '%ASFSDFSF%' OR a.arc_checknum LIKE '%AXX%')

インデックスを使用する場合は、最初の'%'文字を省略する必要があります。


1

Oracle RBDMSでは、REGEXP_LIKE関数を使用してこの動作を実現できます。

次のコードは、文字列3がリスト式oneに存在するかどうかをテストします2 | 3 | 4 | 5(パイプ「|」記号はOR論理演算を意味します)。

SELECT 'Success !!!' result
FROM dual
WHERE REGEXP_LIKE('three', 'one|two|three|four|five');

RESULT
---------------------------------
Success !!!

1 row selected.

前の式は次と同等です。

three=one OR three=two OR three=three OR three=four OR three=five

だから成功するでしょう。

一方、次のテストは失敗します。

SELECT 'Success !!!' result
FROM dual
WHERE REGEXP_LIKE('ten', 'one|two|three|four|five');

no rows selected

10gバージョン以降、Oracleで使用できる正規表現(REGEXP_ *)に関連するいくつかの関数があります。Oracle開発者であり、このトピックに興味がある場合、これはOracle Databaseでの正規表現の使用に適しています


1

あなたはこのような組み合わせを考えるかもしれません:

SELECT  * 
FROM    table t INNER JOIN
(
  SELECT * FROM (VALUES('bla'),('foo'),('batz')) AS list(col)
) l ON t.column  LIKE '%'+l.Col+'%'

ターゲットテーブルにフルテキストインデックスを定義している場合は、次の方法を使用できます。

SELECT  * 
FROM    table t
WHERE CONTAINS(t.column, '"bla*" OR "foo*" OR "batz*"')

ありがとうございました。これは、受け入れられた回答IMOである必要があります。誰もが定義されたフルテキストインデックスを持っているわけではありません(それが何であれ)最初の提案は魅力のように機能します。LIKEで連結する代わりに、ワイルドカードを一時テーブルの値自体に含めることもできます。
ザ・フール

0

このような答えはありません:

SELECT * FROM table WHERE something LIKE ('bla% %foo% batz%')

オラクルでは問題ありません。


0

Teradataではを使用できますLIKE ANY ('%ABC%','%PQR%','%XYZ%')。以下は私にとって同じ結果を生み出した例です

--===========
--  CHECK ONE
--===========
SELECT *
FROM Random_Table A
WHERE (Lower(A.TRAN_1_DSC) LIKE ('%american%express%centurion%bank%')
OR Lower(A.TRAN_1_DSC) LIKE ('%bofi%federal%bank%')
OR Lower(A.TRAN_1_DSC) LIKE ('%american%express%bank%fsb%'))

;
--===========
--  CHECK TWO
--===========
SELECT *
FROM Random_Table  A
WHERE Lower(A.TRAN_1_DSC) LIKE ANY 
('%american%express%centurion%bank%',
'%bofi%federal%bank%',
'%american%express%bank%fsb%')

0

私はこれが非常に遅いことを知っていますが、同様の状況にありました。多くのパラメーターを受け入れ、それらのパラメーターを使用して複数のRDBMSシステムからのデータを集約する一連のストアドプロシージャに「Like In」演算子が必要だったため、RDBMS固有のトリックは機能しませんが、ストアドプロシージャと関数はMS SQL Serverで実行されるため、RDBMSごとに完全なSQLステートメントを生成する機能にT-SQLを使用できますが、出力はRDBMSからかなり独立している必要があります。

これが、区切り文字列(ストアドプロシージャに渡されるパラメーターなど)をSQLのブロックに変換するために今のところ私が思いついたものです。「LIKE IN」を「地衣」と呼んでいます。それを得る?

Lichen.sql

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =======================================================================
-- Lichen - Scalar Valued Function
-- Returns nvarchar(512) of "LIKE IN" results.  See further documentation.
-- CREATOR: Norman David Cooke
-- CREATED: 2020-02-05
-- UPDATED:
-- =======================================================================
CREATE OR ALTER FUNCTION Lichen 
(
    -- Add the parameters for the function here
    @leadingAnd bit = 1,
    @delimiter nchar(1) = ';',
    @colIdentifier nvarchar(64),
    @argString nvarchar(256)
)
RETURNS nvarchar(512)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @result nvarchar(512)

    -- set delimiter to detect (add more here to detect a delimiter if one isn't provided)
    DECLARE @delimit nchar(1) = ';'
    IF NOT @delimiter = @delimit 
        SET @delimit = @delimiter


    -- check to see if we have any delimiters in the input pattern
    IF CHARINDEX(@delimit, @argString) > 1  -- check for the like in delimiter
    BEGIN  -- begin 'like in' branch having found a delimiter
        -- set up a table variable and string_split the provided pattern into it.
        DECLARE @lichenTable TABLE ([id] [int] IDENTITY(1,1) NOT NULL, line NVARCHAR(32))
        INSERT INTO @lichenTable SELECT * FROM STRING_SPLIT(@argString, ';')

        -- setup loop iterators and determine how many rows were inserted into lichen table
        DECLARE @loopCount int = 1
        DECLARE @lineCount int 
        SELECT @lineCount = COUNT(*) from @lichenTable

        -- select the temp table (to see whats inside for debug)
        --select * from @lichenTable

        -- BEGIN AND wrapper block for 'LIKE IN' if bit is set
        IF @leadingAnd = 1
            SET @result = ' AND ('
        ELSE
            SET @result = ' ('

        -- loop through temp table to build multiple "LIKE 'x' OR" blocks inside the outer AND wrapper block
        WHILE ((@loopCount IS NOT NULL) AND (@loopCount <= @lineCount))
        BEGIN -- begin loop through @lichenTable
            IF (@loopcount = 1) -- the first loop does not get the OR in front
                SELECT @result = CONCAT(@result, ' ', @colIdentifier, ' LIKE ''', line, '''') FROM @lichenTable WHERE id = @loopCount
            ELSE  -- but all subsequent loops do
                SELECT @result = CONCAT(@result, ' OR ', @colIdentifier, ' LIKE ''', line, '''') FROM @lichenTable WHERE id = @loopCount
            SET @loopcount = @loopCount + 1     -- increment loop
        END -- end loop through @lichenTable

        -- set final parens after lichenTable loop
        SET @result = CONCAT(@result, ' )')
    END  -- end 'like in' branch having found a delimiter
    ELSE -- no delimiter was provided
    BEGIN   -- begin "no delimiter found" branch
        IF @leadingAnd = 1 
            SET @result = CONCAT(' AND ', @colIdentifier, ' LIKE ''' + @argString + '''')
        ELSE
            SET @result = CONCAT(' ', @colIdentifier, ' LIKE ''' + @argString + '''')
    END     -- end "no delimiter found" branch

    -- Return the result of the function
    RETURN @result
END  -- end lichen function

GO

区切り文字の検出が計画されている可能性がありますが、現時点ではデフォルトでセミコロンに設定されているのでdefault、そこに入力するだけで済みます。これにはおそらくバグがあります。の@leadingAndパラメータは、それが他のWHERE句の追加とうまくに収まるように、あなたはブロックの前に先頭の「AND」プットをしたいかどうかを判断するだけのビットの値です。

使用例(argStringに区切り文字あり)

SELECT [dbo].[Lichen] (
   default        -- @leadingAND, bit, default: 1
  ,default        -- @delimiter, nchar(1), default: ';'
  ,'foo.bar'      -- @colIdentifier, nvarchar(64), this is the column identifier
  ,'01%;02%;%03%' -- @argString, nvarchar(256), this is the input string to parse "LIKE IN" from
)
GO

以下を含むnvarchar(512)を返します:

 AND ( foo.bar LIKE '01%' OR foo.bar LIKE '02%' OR foo.bar LIKE '%03%' ) 

入力に区切り文字が含まれていない場合も、ブロックをスキップします。

使用例(argStringに区切り文字なし)

SELECT [dbo].[Lichen] (
   default        -- @leadingAND, bit, default: 1
  ,default        -- @delimiter, nchar(1), default: ';'
  ,'foo.bar'      -- @colIdentifier, nvarchar(64), this is the column identifier
  ,'01%'          -- @argString, nvarchar(256), this is the input string to parse "LIKE IN" from
)
GO

以下を含むnvarchar(512)を返します:

 AND foo.bar LIKE '01%'

私はこれについて作業を続けるつもりですので、私が何かを見過ごしていた場合は(目立って明白かどうかにかかわらず)、コメントまたはお気軽にご連絡ください。


-3

これを行う

WHERE something + '%' in ('bla', 'foo', 'batz')
OR '%' + something + '%' in ('tra', 'la', 'la')

または

WHERE something + '%' in (select col from table where ....)

1
それはどうですか?LHSは、%の文字列であり、その%は、従って、ワイルドカードではない
ダリウスX.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.