7.20.4 LIKE述語
特定の文字列が含まれているデータを検索する際にLIKE述語を使用します。
(1) 指定形式
LIKE述語::=一致値 〔NOT〕 LIKE パターン文字列 〔ESCAPE エスケープ文字〕 一致値::=値式 パターン文字列::=値式 エスケープ文字::=値式
(2) 指定形式の説明
- 一致値:
-
検索対象のデータを値式の形式で指定します。値式については,「7.21 値式」を参照してください。
一致値には,CHAR型またはVARCHAR型のデータを指定してください。
- NOT:
-
NOTを指定すると,指定したパターン文字列と一致しない値が検索対象になります。
- パターン文字列:
-
パターン文字列を値式の形式で指定します。値式については,「7.21 値式」を参照してください。
パターン文字列には,CHAR型またはVARCHAR型のデータを指定してください。
なお,パターン文字列には,_(下線)または%(パーセント)の特殊文字が指定できます。 _ は任意の1文字を意味し,%は0文字以上の任意の文字列を意味します。これらの特殊文字を使うと,例えば次のような検索ができます。
-
'電気'で始まる5文字の文字列:'電気_ _ _'
-
'OR'を含む文字列:'%OR%'
パターン文字列中に _ や%を指定すると,特殊文字と見なされ,通常文字としては扱われません。_ や%を通常文字として扱いたい場合は,エスケープ文字を指定する必要があります。
-
- ESCAPE エスケープ文字:
-
エスケープ文字を値式の形式で指定します。値式については,「7.21 値式」を参照してください。
エスケープ文字には,1バイトのCHAR型またはVARCHAR型のデータを指定してください。
エスケープ文字を指定すると,パターン文字列中の特殊文字(エスケープ文字の直後の特殊文字)を通常文字として扱うことができます。
(例)特殊文字%を指定している場合
LIKE 'ABC@%' ...1 LIKE 'ABC@%' ESCAPE '@' ...2
1の場合は,%が特殊文字として扱われるため,'ABC@'で始まる文字列が検索対象になります。2の場合は,%が通常文字として扱われるため,'ABC%'の文字列が検索対象になります。
パターン文字列中にエスケープ文字がある場合の扱いについては,「(4) エスケープ文字を指定したときの扱い」を参照してください。
(3) パターン文字列の指定例
パターン文字列の代表的な指定例を次の表に示します。
項番 |
項目 |
パターン文字列の指定 |
意味 |
パターン文字列の指定例 |
検索対象となる文字列 |
---|---|---|---|---|---|
1 |
前方一致 |
xxx% |
文字列の先頭部分が「xxx」である |
'ACT%' |
ACT,ACTOR,ACTIONなど,ACTで始まる文字列 |
2 |
後方一致 |
%xxx |
文字列の最後の部分が「xxx」である |
'%ING' |
ING,BEING,HAVINGなど,INGで終わる文字列 |
3 |
任意一致 |
%xxx% |
文字列中の任意の部分に「xxx」を含む |
'%日%' |
日,日立,昨日,本日中など,日を含む文字列 |
4 |
完全一致 |
xxx |
文字列が「xxx」と等しい |
'EQUAL' |
EQUAL |
5 |
部分一致 |
_…_xxx_…_ |
文字列中の特定の部分が「xxx」と等しく,ほかの部分は任意の文字である _ 1つが任意の1文字を意味している |
'_I_' |
BIT,HIT,KITなど,3文字の文字列で,2文字目がIの文字列 |
6 |
'_ _T_ _ _ _' |
HITACHIなど,7文字の文字列で,3文字目がTの文字列 |
|||
7 |
そのほか |
xxx%yyy |
文字列の先頭部分が「xxx」で,最後の部分が「yyy」である |
'O%N' |
ON,OWN,ORIGINなど,Oで始まりNで終わる文字列 |
8 |
%xxx%yyy% |
文字列中の任意の部分に「xxx」を含み,その部分よりあとの任意の部分に「yyy」を含む |
'%O%N%' |
ON,ONE,DOWN,COUNTなど,Oを含み,それよりあとにNを含む文字列 |
|
9 |
xxx_…_yyy% |
文字列の先頭部分が「xxx」で,そのあとに任意の文字列が続き,そのあとに「yyy」が続く _ 1つが任意の1文字を意味している |
'CO_ _ECT%' |
CORRECT,CONNECTER,CONNECTIONなど,7文字以上の文字列で,COで始まり5文字目から7文字目がECTの文字列 |
- 注
-
-
「xxx」,「yyy」は,%,_ を含まない任意の文字列です。
-
空白も比較対象になるため,後方に空白のあるデータと比較した場合,結果は偽になります。
-
(4) エスケープ文字を指定したときの扱い
パターン文字列中にエスケープ文字がある場合の扱いを次に示します。以下の例では@をエスケープ文字としています。
-
エスケープ文字の直後が特殊文字の場合,その特殊文字は通常文字として扱われます。
(例1)
LIKE 'AB@%C%' ESCAPE '@'
この場合,@の後ろの特殊文字は通常文字として扱われるため,AB%C,AB%CDEなど,AB%Cで始まる文字列が検索対象になります。
(例2)
LIKE 'AB@_C%' ESCAPE '@'
この場合,@の後ろの特殊文字は通常文字として扱われるため,AB_C,AB_CDEなど,AB_Cで始まる文字列が検索対象になります。
-
エスケープ文字の直後が通常文字の場合,エスケープ文字は読み飛ばされます。
(例)
LIKE 'ABC@D' ESCAPE '@' → LIKE 'ABCD'と等価
この場合,@は読み飛ばされます。
-
エスケープ文字が2つ連続している場合,2つ連続しているエスケープ文字は通常文字1文字として扱われます。
(例1)
LIKE 'AB@@C' ESCAPE '@' → LIKE 'AB@C'と等価
この場合,@@は通常文字の@1文字として扱われます。
(例2)
LIKE 'AB@@@C' ESCAPE '@' → LIKE 'AB@C'と等価
この場合,最初の@@は通常文字の@1文字として扱われます。3文字目の@は,後ろの文字が通常文字のため,読み飛ばされます。
(例3)
LIKE 'AB@@@@C' ESCAPE '@' → LIKE 'AB@@C'と等価
この場合,最初の@@は通常文字の@1文字として扱われます。3〜4文字目の@も,通常文字の@1文字として扱われます。
(例4)
LIKE 'AB@@C@%D%' ESCAPE '@'
この場合,AB@C%D,AB@C%DEなど,AB@C%Dで始まる文字列が検索対象になります。
-
エスケープ文字の後ろに文字がない場合,そのエスケープ文字は読み飛ばされます。
(例)
LIKE 'ABC@' ESCAPE '@' → LIKE 'ABC'と等価
(5) 述語の評価
一致値とパターン文字列のパターンが一致した場合に真となります。そうでない場合は偽となります。
NOTを指定したときは,一致値とパターン文字列のパターンが一致しない場合に真となります。そうでない場合は偽となります。
一致値,またはパターン文字列のどちらかの結果がナル値の場合,述語の結果は不定となります。
なお,一致値が長さ0バイトまたは長さ0文字のときは,次に示す場合に限りLIKE述語の結果が真となります。
-
パターン文字列が長さ0バイトまたは長さ0文字の場合
-
パターン文字列に?パラメタを指定していて,その入力値が'%'の場合
-
パターン文字列に定数で'%'を指定した場合
また,パターン文字列が長さ0バイトまたは長さ0文字のときは,一致値が長さ0バイトまたは長さ0文字の場合に限りLIKE述語の結果が真となります。
(6) 規則
(a) 一致値に関する規則
-
一致値に指定する_ および%はすべて半角(最小バイト文字)で指定してください。
-
一致値に?パラメタを単独で指定した場合,?パラメタに仮定されるデータ型はVARCHAR(32000)になります。
(b) パターン文字列に関する規則
-
パターン文字列の長さには,_ および%を含みます。
-
パターン文字列中に%を指定しない場合,一致値のデータの長さとパターン文字列の長さが異なると,この述語は真になりません。
-
パターン文字列に?パラメタを単独で指定した場合,?パラメタに仮定されるデータ型とデータ長は,次の表に示すとおりになります。
表7‒8 ?パラメタに仮定されるデータ型とデータ長(パターン文字列に?パラメタを単独で指定した場合) 条件
?パラメタに仮定されるデータ型
?パラメタに仮定されるデータ長
エスケープ文字の指定がない場合
VARCHAR型
一致値の結果のデータ長
エスケープ文字の指定がある場合
VARCHAR型
-
一致値の結果のデータ長が32,000バイト以下の場合
MIN(一致値の結果のデータ長×2 ,32,000)
-
一致値の結果のデータ長が32,001バイト以上の場合
MIN(一致値の結果のデータ長×2 ,64,000)
-
(c) エスケープ文字に関する規則
-
エスケープ文字が長さ0バイトまたは長さ0文字の場合,エスケープ文字の指定がされていないと扱われます。
(例)
LIKE 'ABC' ESCAPE '' → LIKE 'ABC'と等価 LIKE 'ABC' ESCAPE ? → ?パラメタでNULLを指定した場合,LIKE 'ABC'と等価
-
エスケープ文字に?パラメタを単独で指定した場合,?パラメタに仮定されるデータ型はVARCHAR(1)になります。また,このときのデータの実長は1バイトである必要があります。
-
パターン文字列中のエスケープ文字の判定は,1バイトごとでなく1文字ごとに行われます。
-
エスケープ文字に指定できる文字コードの範囲を次の表に示します。
表7‒9 エスケープ文字に指定できる文字コードの範囲 環境変数ADBLANGの指定値
エスケープ文字に指定できる文字コードの範囲
UTF8(Unicode(UTF-8)の場合)
0x00〜0x7F※
SJIS(Shift-JISの場合)
0x00〜0xFF
- 注※
-
Shift-JISの\(0x5C),および ~(0x7E)は,UTF-8でマルチバイト文字と扱われた場合は範囲対象外となります。
(7) 例題
- 例題1
-
名前がMで始まる顧客の,顧客ID(USERID),名前(NAME)を検索します。
SELECT "USERID","NAME" FROM "USERSLIST" WHERE "NAME" LIKE 'M%'
下線部分がLIKE述語の指定です。
- 例題2
-
名前がMで始まらない女性の顧客の,顧客ID(USERID),名前(NAME)を検索します。
SELECT "USERID","NAME" FROM "USERSLIST" WHERE "NAME" NOT LIKE 'M%' AND SEX='F'
下線部分がLIKE述語の指定です。
- 例題3
-
パターン表(T_PATTERN)のパターン列(PATTERN)中の文字列で始まる商品を,売上表(T_SALES)の商品列(GOODS)から検索します。
SELECT "A"."GOODS" FROM "T_SALES" AS "A","T_PATTERN" AS "B" WHERE "A"."GOODS" LIKE "B"."PATTERN" + '%'
下線部分がLIKE述語の指定です。
- 例題4
-
売上表(T_SALES)から,次の条件に該当する商品名(GOODS)と売り上げ金額(SALES)を検索します。
-
商品名に _(下線)が含まれている商品
-
支店コード(BRANCH_CODE)がA001の支店で扱っている商品
_(下線)は特殊文字のため,エスケープ文字に@を指定して,_を通常文字として扱うようにします。
SELECT "GOODS","SALES" FROM "T_SALES" WHERE "GOODS" LIKE '%@_%' ESCAPE '@' AND "BRANCH_CODE"='A001'
-