概要
LIKE 述語を使用して、pattern で指定する 1 つ以上の文字と一致するデータの値を選択できます。pattern にはワイルドカード文字を含めることができます。pattern がスカラ式のいずれの値とも一致しない場合、LIKE は NULL 文字列を返します。
述語条件を指定できる場所であればどこでも、LIKE を使用できます。詳細は、このドキュメントの "述語の概要" ページを参照してください。
LIKE 述語は、以下のワイルドカードをサポートします。
LIKE ワイルドカード文字
文字 |
以下と一致 |
_ |
単独の文字。 |
% |
0 かそれ以上の文字のシーケンス (SQL 標準に従い、NULL は 0 文字のシーケンスとは見なされず、このワイルドカードによって選択されません)。 |
“例” のセクションに示されているように、ダイナミック SQL または埋め込み SQL では、pattern を使用して、ワイルドカード文字と入力パラメータまたは入力ホスト変数を連結文字列として表すことができます。
Note:
実行時に述語の値を指定した場合 (? 入力パラメータまたは :var 入力ホスト変数を使用)、その結果の述語 %STARTSWITH 'abc' は、同等の結果の述語 LIKE 'abc%' よりもパフォーマンスが優れています。
照合タイプ
pattern 文字列はマッチングの対象となる列と同じ照合タイプを使用します。既定では、文字列データ型フィールドは大文字と小文字が区別されない SQLUPPER 照合で定義されます。現在のネームスペースにおける既定の文字列の照合の定義およびフィールド/プロパティの定義における既定以外のフィールドの照合タイプの指定の詳細は、"InterSystems IRIS の使用法" の “照合” の章を参照してください。クエリに ESCAPE char 節が含まれる場合、エスケープ処理は照合の後に実行されます。
既定の照合タイプ SQLUPPER のフィールドに LIKE が適用された場合、LIKE 節は大文字と小文字を無視して一致するものを返します。SQLSTRING 照合タイプを使用することで、大文字と小文字を区別する LIKE の文字列比較を実行できます。
以下の例は、部分文字列 “Ro” を含むすべての名前を返します。LIKE は大文字と小文字を区別しないため、LIKE '%Ro%' は、Robert、Rogers、deRocca、LaRonga、Brown、Mastroni などを返します。
SELECT Name FROM Sample.Person
WHERE Name LIKE '%Ro%'
これを包含関係演算子 ([) と比較します。これは、EXACT (大文字と小文字を区別する) 照合を使用します。
SELECT Name FROM Sample.Person
WHERE Name [ 'Ro'
%SQLSTRING 照合タイプを使用することで、LIKE を使用して、大文字と小文字が区別される部分文字列 “Ro” を含む名前のみを返すようにすることができます。これは、Mastroni または Brown は返しません。
SELECT Name FROM Sample.Person
WHERE %SQLSTRING(Name) LIKE '%Ro%'
上記の例で、%SQLSTRING が Name の値に追加した先行のスペースは、ワイルドカード % によって処理されました。さらに堅牢な例では、照合タイプを述語の両側に指定します。
SELECT Name FROM Sample.Person
WHERE %SQLSTRING(Name) LIKE %SQLSTRING('%Ro%')
ケース変換関数の詳細は、"%SQLUPPER" を参照してください。
すべての値、空の文字列値、および NULL
pattern 値がパーセント (%) である場合、LIKE は、空文字列値を含む、指定されたフィールドのすべての値を選択します。
SELECT Name,FavoriteColors FROM Sample.Person
WHERE FavoriteColors LIKE '%'
NULL であるフィールドは選択されません。
空文字列の pattern 値を指定すると、空文字列値が返されます。
SELECT Name,FavoriteColors FROM Sample.Person
WHERE FavoriteColors LIKE ''
NULL の pattern 値を指定すると、意味のある操作ではなくなります。操作は正常に完了しますが、値が返されません。
SELECT Name,FavoriteColors FROM Sample.Person
WHERE FavoriteColors LIKE NULL
ほとんどの述語と同様に、LIKE は NOT 論理演算子を使用して反転できます。LIKE も NOT LIKE も、NULL フィールドを返すために使用することはできません。NULL フィールドを返すには、IS NULL を使用します。
ESCAPE 節
ESCAPE では、pattern 内でワイルドカード文字をリテラル文字として使用できます。ESCAPE char が指定され、単一文字である場合、これは、pattern 内の直接の文字を、ワイルドカードや書式設定文字ではなく、リテラル文字として解釈するように指示します。以下の例では、ESCAPE を使用して、文字列 '_SYS' を含む値を返しています。
SELECT * FROM MyTable
WHERE symbol_field LIKE '%\_SYS%' ESCAPE '\'
%SelectMode
LIKE 述語は、現在の %SelectMode 設定を使用しません。pattern は、%SelectMode 設定に関係なく、論理形式で指定する必要があります。pattern を ODBC 形式または表示形式で指定しようとすると、通常は、データが一致しないか、意図していないデータと一致することになります。
%EXTERNAL または %ODBCOUT 形式変換関数を使用すると、述語による操作対象となる scalar-expression フィールドを変換できます。これにより、表示形式または ODBC 形式で pattern を指定できるようになります。ただし、形式変換関数を使用すると、そのフィールドのためのインデックスを使用できなくなり、それによってパフォーマンスに大きな影響を与える可能性があります。
以下のダイナミック SQL の例では、LIKE 述語で、%SelectMode=1 (ODBC) の形式ではなく論理形式で日付の pattern を指定します。41 で始まる DOB 論理値がある行 (1953 年 4 月 4 日 ($HOROLOG 41000) から 1955 年 12 月 28 日 ($HOROLOG 41999) までの日付) が選択されます。
SET q1 = "SELECT Name,DOB FROM Sample.Person "
SET q2 = "WHERE DOB LIKE '41%'"
SET myquery = q1_q2
SET tStatement = ##class(%SQL.Statement).%New()
SET tStatement.%SelectMode=1
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
WRITE !,"End of data"
以下のダイナミック SQL の例では、%ODBCOUT 形式変換関数を使用して、述語によって、一致した DOB フィールドを変換します。これにより、ODBC 形式で LIKE pattern を指定できるようになります。それにより、DOB フィールドの ODBC 値が 195 で始まる行 (1950 年から 1959 年の範囲内の日付) が選択されます。ただし、形式変換関数を指定すると、DOB フィールド値のためのインデックスを使用できなくなります。
SET q1 = "SELECT Name,DOB FROM Sample.Person "
SET q2 = "WHERE %ODBCOUT(DOB) LIKE '195%'"
SET myquery = q1_q2
SET tStatement = ##class(%SQL.Statement).%New()
SET tStatement.%SelectMode=1
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
WRITE !,"End of data"
リテラル置換のオーバーライド
LIKE 述語引数を二重の括弧で囲むことで、コンパイルの事前解析時にリテラル置換をオーバーライドできます。例えば、WHERE Name LIKE (('Mc%')) や WHERE Name LIKE (('%son%')) のように指定します。これにより、全体的な選択性や添え字境界の選択性が向上し、クエリのパフォーマンスが向上する場合があります。ただし、同じクエリを別の値で複数回呼び出すことは避けてください。それぞれのクエリ呼び出しでキャッシュされたクエリが個別に作成されることになってしまいます。
例
以下の例では、WHERE 節を使用して、“son” を含む Name の値を選択します。これには先頭または末尾が “son” のものも含まれます。既定では、LIKE の文字列比較は大文字と小文字が区別されません。
SELECT %ID,Name FROM Sample.Person
WHERE Name LIKE '%son%'
以下の埋め込み SQL の例は、前の例と同じ結果セットを返します。LIKE pattern で連結演算子を使用して入力ホスト変数 (:subname) がどのように指定されているかに注意してください。
SET subname="son"
&sql(DECLARE C1 CURSOR FOR SELECT %ID,Name INTO :id,:nameout FROM Sample.Person
WHERE Name LIKE '%'_:subname_'%')
&sql(OPEN C1)
QUIT:(SQLCODE'=0)
&sql(FETCH C1)
WHILE (SQLCODE = 0) {
WRITE id," ",nameout,!
&sql(FETCH C1) }
&sql(CLOSE C1)
以下のダイナミック SQL の例は、前の例と同じ結果セットを返します。LIKE pattern で連結演算子を使用して入力パラメータ (?) がどのように指定されているかに注意してください。
SET myquery = "SELECT %ID,Name FROM Sample.Person WHERE Name LIKE '%'_?_'%'"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute("son")
DO rset.%Display()
以下の例では、WHERE 節を使用して、“blue” を含む FavoriteColors の値を選択しています。FavoriteColors フィールドは %List フィールドです。ワイルドカード % は、以下の %List 書式設定文字を処理します。
SELECT Name,FavoriteColors FROM Sample.Person
WHERE FavoriteColors LIKE '%blue%'
以下の例では、HAVING 節を使用して、年齢が 1 で始まりその後に 1 文字続く人のレコードを選択しています。すべての年齢の平均と HAVING 節で選択された年齢の平均が表示されます。結果は年齢順に並べ替えられます。年齢が 10 ~ 19 までのすべての値が返されます。
SELECT Name,
Age,
AVG(Age) AS AvgAge,
AVG(Age %AFTERHAVING) AS AvgTeen
FROM Sample.Person
HAVING Age LIKE '1_'
ORDER BY Age