Hitachi

Hitachi Advanced Data Binder SQLリファレンス


7.19.4 LIKE述語

特定の文字列が含まれているデータを検索する際にLIKE述語を使用します。

〈この項の構成〉

(1) 指定形式

LIKE述語::=一致値 〔NOT〕 LIKE パターン文字列 〔ESCAPE エスケープ文字一致値::=値式
  パターン文字列::=値式
  エスケープ文字::=値式

(2) 指定形式の説明

一致値

検索対象のデータを値式の形式で指定します。値式については,「7.20 値式」を参照してください。

一致値には,CHAR型またはVARCHAR型のデータを指定してください。

NOT

NOTを指定すると,指定したパターン文字列と一致しない値が検索対象になります。

パターン文字列

パターン文字列を値式の形式で指定します。値式については,「7.20 値式」を参照してください。

パターン文字列には,CHAR型またはVARCHAR型のデータを指定してください。

なお,パターン文字列には,_(下線)または%(パーセント)の特殊文字が指定できます。 _ は任意の1文字を意味し,%は0文字以上の任意の文字列を意味します。これらの特殊文字を使うと,例えば次のような検索ができます。

  • '電気'で始まる5文字の文字列:'電気_ _ _'

  • 'OR'を含む文字列:'%OR%'

パターン文字列中に _%を指定すると,特殊文字と見なされ,通常文字としては扱われません。_%を通常文字として扱いたい場合は,エスケープ文字を指定する必要があります。

ESCAPE エスケープ文字

エスケープ文字を値式の形式で指定します。値式については,「7.20 値式」を参照してください。

エスケープ文字には,1バイトのCHAR型またはVARCHAR型のデータを指定してください。

エスケープ文字を指定すると,パターン文字列中の特殊文字(エスケープ文字の直後の特殊文字)を通常文字として扱うことができます。

(例)特殊文字%を指定している場合

LIKE 'ABC@%'               ...1
LIKE 'ABC@%' ESCAPE '@'    ...2

1の場合は,%が特殊文字として扱われるため,'ABC@'で始まる文字列が検索対象になります。2の場合は,%が通常文字として扱われるため,'ABC%'の文字列が検索対象になります。

パターン文字列中にエスケープ文字がある場合の扱いについては,「(4) エスケープ文字を指定したときの扱い」を参照してください。

(3) パターン文字列の指定例

パターン文字列の代表的な指定例を次の表に示します。

表7‒4 パターン文字列の代表的な指定例

項番

項目

パターン文字列の指定

意味

パターン文字列の指定例

検索対象となる文字列

1

前方一致

xxx%

文字列の先頭部分が「xxx」である

'ACT%'

ACTACTORACTIONなど,ACTで始まる文字列

2

後方一致

%xxx

文字列の最後の部分が「xxx」である

'%ING'

INGBEINGHAVINGなど,INGで終わる文字列

3

任意一致

%xxx%

文字列中の任意の部分に「xxx」を含む

'%日%'

など,を含む文字列

4

完全一致

xxx

文字列が「xxx」と等しい

'EQUAL'

EQUAL

5

部分一致

_…_xxx_…_

文字列中の特定の部分が「xxx」と等しく,ほかの部分は任意の文字である

_ 1つが任意の1文字を意味している

'_I_'

BITHITKITなど,3文字の文字列で,2文字目がIの文字列

6

'_ _T_ _ _ _'

HITACHIなど,7文字の文字列で,3文字目がTの文字列

7

そのほか

xxx%yyy

文字列の先頭部分が「xxx」で,最後の部分が「yyy」である

'O%N'

ONOWNORIGINなど,Oで始まりNで終わる文字列

8

%xxx%yyy%

文字列中の任意の部分に「xxx」を含み,その部分よりあとの任意の部分に「yyy」を含む

'%O%N%'

ONONEDOWNCOUNTなど,Oを含み,それよりあとにNを含む文字列

9

xxx_…_yyy%

文字列の先頭部分が「xxx」で,そのあとに任意の文字列が続き,そのあとに「yyy」が続く

_ 1つが任意の1文字を意味している

'CO_ _ECT%'

CORRECTCONNECTERCONNECTIONなど,7文字以上の文字列で,COで始まり5文字目から7文字目がECTの文字列

  • xxx」,「yyy」は,_ を含まない任意の文字列です。

  • 空白も比較対象になるため,後方に空白のあるデータと比較した場合,結果は偽になります。

(4) エスケープ文字を指定したときの扱い

パターン文字列中にエスケープ文字がある場合の扱いを次に示します。以下の例では@をエスケープ文字としています。

  1. エスケープ文字の直後が特殊文字の場合,その特殊文字は通常文字として扱われます。

    (例1)

    LIKE 'AB@%C%' ESCAPE '@'

    この場合,@の後ろの特殊文字は通常文字として扱われるため,AB%CAB%CDEなど,AB%Cで始まる文字列が検索対象になります。

    (例2)

    LIKE 'AB@_C%' ESCAPE '@'

    この場合,@の後ろの特殊文字は通常文字として扱われるため,AB_CAB_CDEなど,AB_Cで始まる文字列が検索対象になります。

  2. エスケープ文字の直後が通常文字の場合,エスケープ文字は読み飛ばされます。

    (例)

    LIKE 'ABC@D' ESCAPE '@' → LIKE 'ABCD'と等価

    この場合,@は読み飛ばされます。

  3. エスケープ文字が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%DAB@C%DEなど,AB@C%Dで始まる文字列が検索対象になります。

  4. エスケープ文字の後ろに文字がない場合,そのエスケープ文字は読み飛ばされます。

    (例)

    LIKE 'ABC@' ESCAPE '@' → LIKE 'ABC'と等価

(5) 述語の評価

一致値パターン文字列のパターンが一致した場合に真となります。そうでない場合は偽となります。

NOTを指定したときは,一致値パターン文字列のパターンが一致しない場合に真となります。そうでない場合は偽となります。

一致値,またはパターン文字列のどちらかの結果がナル値の場合,述語の結果は不定となります。

なお,一致値が長さ0バイトまたは長さ0文字のときは,次に示す場合に限りLIKE述語の結果が真となります。

また,パターン文字列が長さ0バイトまたは長さ0文字のときは,一致値が長さ0バイトまたは長さ0文字の場合に限りLIKE述語の結果が真となります。

(6) 規則

(a) 一致値に関する規則

  1. 一致値に指定する_ およびはすべて半角(最小バイト文字)で指定してください。

  2. 一致値に?パラメタを単独で指定した場合,?パラメタに仮定されるデータ型はVARCHAR(32000)になります。

(b) パターン文字列に関する規則

  1. パターン文字列の長さには,_ およびを含みます。

  2. パターン文字列中にを指定しない場合,一致値のデータの長さとパターン文字列の長さが異なると,この述語は真になりません。

  3. パターン文字列に?パラメタを単独で指定した場合,?パラメタに仮定されるデータ型とデータ長は,次の表に示すとおりになります。

    表7‒5 ?パラメタに仮定されるデータ型とデータ長(パターン文字列に?パラメタを単独で指定した場合)

    条件

    ?パラメタに仮定されるデータ型

    ?パラメタに仮定されるデータ長

    エスケープ文字の指定がない場合

    VARCHAR

    一致値の結果のデータ長

    エスケープ文字の指定がある場合

    VARCHAR

    • 一致値の結果のデータ長が32,000バイト以下の場合

      MIN(一致値の結果のデータ長×2 ,32,000)

    • 一致値の結果のデータ長が32,001バイト以上の場合

      MIN(一致値の結果のデータ長×2 ,64,000)

(c) エスケープ文字に関する規則

  1. エスケープ文字が長さ0バイトまたは長さ0文字の場合,エスケープ文字の指定がされていないと扱われます。

    (例)

    LIKE 'ABC' ESCAPE '' → LIKE 'ABC'と等価
    LIKE 'ABC' ESCAPE ?  → ?パラメタでNULLを指定した場合,LIKE 'ABC'と等価
  2. エスケープ文字に?パラメタを単独で指定した場合,?パラメタに仮定されるデータ型はVARCHAR(1)になります。また,このときのデータの実長は1バイトである必要があります。

  3. パターン文字列中のエスケープ文字の判定は,1バイトごとでなく1文字ごとに行われます。

  4. エスケープ文字に指定できる文字コードの範囲を次の表に示します。

    表7‒6 エスケープ文字に指定できる文字コードの範囲

    環境変数ADBLANGの指定値

    エスケープ文字に指定できる文字コードの範囲

    UTF8(Unicode(UTF-8)の場合)

    0x000x7F

    SJIS(Shift-JISの場合)

    0x000xFF

    注※

    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'

[図データ]