LIKE 述部

LIKE 述部は、ある一定のパターンをもったストリングを探索するものです。

構文図を読むビジュアルシンタックスダイアグラムをスキップする一致式NOTLIKEpattern-expression ESCAPEエスケープ式

match-expressionpattern-expression に指定したパターンと 一致しているかどうかをテストする対象のストリングです。 パターン内の下線文字と % 記号文字は、文字どおりの意味とは異なる特殊な意味を持ちます。ただし、escape-expression を指定した場合は別です。 詳しくは、pattern-expression の説明を参照してください。

以下の規則は、「m LIKE p」という形式の述部を評価する方法を要約しています。

  • m または p が NULL の場合、 この述部の結果は不明です。
  • mp が 両方とも空の場合、この述部の結果は真です。
  • m が空で p が 空でない場合、p が 1 つ以上の % 記号から構成されているのでない限り、この述部の結果は不明です。
  • m が空でなく p が 空である場合、この述部の結果は偽です。
  • それ以外の場合、mp の パターンと一致すれば、述部の結果は真です。 pattern-expression の項では、述部が真または偽であるかを評価する ためにパターンを突き合わせる方法を詳細に説明しています。

    LIKE blank insignificant 動作が使用可能な場合に述部変更を評価するためにパターンを突き合わせる方法。 詳細は、「LIKE 空白の無意味な動作サブシステムパラメータ 」を参照してください。

match-expressionpattern-expression、 および escape-expression の値は、 すべて文字ストリングまたはすべてグラフィック・ストリングであるか、 両方の混合であるか、またはすべてバイナリー・ストリング (BLOB) でなければなりません。 どの式も、特殊タイプを生成することはできませんが、特殊タイプを そのソース・タイプにキャストする関数にすることはできます。

サポートされる式は、引数ごとに少し異なります。 各引数の説明に、サポートされる式がリストされています。

一致式
特定の文字パターンに一致しているかどうかをテストする対象のストリングを 指定する式。
LIKE パターン表現
突き合わせる文字パターンを指定する式。

式は以下のいずれかによって指定することができます。

  • 定数
  • 特殊レジスター
  • 変数
  • 引数が上記のいずれかであるスカラー関数 (ただし、 ネストされた関数呼び出しは使用できない)
  • 配列エレメント指定
  • その引数が上記のいずれかであるような CAST の指定
  • 上記のいずれかを連結する式 (CONCAT または || を用いる)

式は以下の制約事項に従う必要もあります。

  • pattern-expression の最長は、4000 バイトを 超えてはなりません。
  • ホスト変数を pattern-expression で使用する場合、ホスト変数は、 ストリング・ホスト変数を宣言する規則に従って定義する必要があり、また 構造であってはなりません。 特定のプログラミング言語におけるホスト変数の使用に関する詳細は、「ホスト変数」 を参照してください。
  • escape-expression を指定する場合、pattern-expression には、escape-expression によって識別されるエスケープ文字を含めることはできません。ただし、その直後にエスケープ文字、「%」、または「_」が続く場合を除きます。例えば、「+」がエスケープ文字の場合、「++」、「+_」、または「+%」以外の「+」のオカレンスはすべてエラーになります。

パターンは match-expression 内の値の一致基準を指定するために使用されます。

  • 下線文字 (_) は、任意の 1 文字を表します。
  • パーセント記号 (%) は、ゼロ個以上の文字のストリングを表します。
  • 上記以外のすべての文字は、その文字自体が 1 回あることを表す。

pattern-expression に下線文字またはパーセント文字を含める必要がある 場合、escape-expression を使用して、パターン内の下線文字または パーセント文字のいずれかの前に置く文字を指定します。 文字 ストリングの場合、文字% 記号、および下線 という 用語は SBCS 文字を指します。 グラフィック・ストリングの場合、 これらの用語は 2 バイト文字または UTF-16 文字を指します。

固定長ストリング変数内にパターンを指定した場合は、末尾ブランクがあれば、それらもすべてパターンの一部として解釈されます。 したがって、実際の長さがパターンの長さと同じである 可変長ストリング変数を使った方がよいでしょう。 ホスト言語が可変長ストリング変数を認めない場合には、長さが パターンの長さである固定長ストリング変数にパターンを入れてください。

パターンに関する正確な記述: ここに示す、パターンのより正確な記述では、escape-expression の使用を無視します。

mmatch-expression の値とし、 ppattern-expression の値とします。 ストリング p は、p の各文字が 必ず 1 つのサブストリング指定子に含まれるような形の最小の数のサブストリング指定子列として解釈されます。 サブストリング指定子とは、下線、パーセント記号、または下線およびパーセント記号以外の任意の空でない一連の文字です。

m または p が NULL 値の場合、 この述部の結果は不明です。 それ以外の場合の結果は、真か偽のどちらかになります。 mp が両方とも空ストリング の場合、または m が以下のようなサブストリングに分割 される場合には、結果は真です。

  • m のサブストリングが 0 個または 1 文字以上の 連続した文字シーケンスであり、m の各文字が必ず 1 つのサブストリングに含まれている。
  • n 番目のサブストリング指定子が下線の場合は 、mn 番目のサブストリング が任意の 1 文字である。
  • n 番目のサブストリング指定子が % 記号の場合は mn 番目のサブストリング が 0 個または 1 文字以上の文字シーケンスである。
  • n 番目のサブストリング指定子が下線でも % 記号でもない場合は、mn 番目 のサブストリングがそのサブストリング指定子と等しく、長さもサブストリング指定子 と等しい。
  • m のサブストリングの数が、サブストリング指定子 の数と同じである。

p が空ストリングで、m が 空ストリングでない場合、結果は偽になります。 同様に 、m が空ストリングで、p が 空ストリングでなくパーセント記号以外の値で構成されている場合も、結果は偽になります。

m NOT LIKE p という述部は、検索条件 NOT (m LIKE p) と等価です。

混合データ・パターン: match-expression が 混合データの場合、パターンは混合データであると見なされます。 ASCII およ び EBCDIC の場合、パターン内の特殊文字は以下のように解釈されます。

  • SBCS の下線は 1 つの SBCS 文字を示します。
  • DBCS の下線は 1 つの MBCS 文字を示します。
  • % 記号 (SBCS または DBCS) はゼロまたは 1 つ以上 の SBCS または MBCS 文字のストリングを示します。

EBCDIC の場合、match-expression または pattern-expression 内の重複シフト・バイトは無視されます。

Unicode の場合、パターン内の特殊文字は以下のように解釈されます。

  • SBCS または DBCS の下線は 1 つの文字 (SBCS または MBCS) を指します。
  • % 記号 (SBCS または DBCS) はゼロまたは 1 つ以上 の SBCS または MBCS 文字のストリングを示します。
LIKE 述部が Unicode データを指定して使用される場合、 Unicode の % 記号および下線は、以下の表で示されるコード・ポイントを使用します。
文字 UTF-8 UTF-16
半角の % X'25' X'0025'
全角の % X'EFBC85' X'FF05'
半角の _ X'5F' X'005F'
全角の _ X'EFBCBF' X'FF3F'
全角または半角の % は、ゼロまたはそれ以上の文字に対応します。 全角または半角の _ 文字は、正確にただ 1 つの文字と対応します。 (ASCII または EBCDIC データの場合、全角の _ 文字は 1 つの DBCS 文字と対応します。)

バイナリー・データ・パターン: バイナリー・データの列の場合、パターンにはバイトが含まれます。 パターン内の特殊バイトは以下のように解釈されます。

  • SBCS 下線のコード・ポイント (X'6D') は、1 バイトを参照します。
  • SBCS パーセントのコード・ポイント (X'6C') は、任意数のバイトを参照します。

パラメーター・マーカー:

LIKE 述部で指定されたパターンがパラメーター・マーカーであり、固定長の文字変数を使用してパラメーター・マーカーを置き換えるという場合は、変数に関す る正しい長さの値を指定してください。 正しい長さを指定しないと、この選択では、意図した結果は戻されません。

例えば、変数が CHAR(10) として定義されていて、'WYSE%' という値がその変数に割り当てられると、割り当てのときに、その変数はブランクで 埋め込みされます。 使用されているパターンは「WYSE%」であり、 Db2 に「LIKE」が指定されていない限り、「WYSE」で始まり5つの空白で終わるすべての値を検索するよう要求します。 「WYSE」で始まる値のみを検索をしたい場合は、変数に値「WYSE%%%%%%」を割り当てます。

ESCAPE エスケープ式
pattern-expression 内の下線 (_) 文字と パーセント (%) 文字を変更するために使用する拡張文字を指定する式。 式 (オプション) を指定すると、LIKE 述部は値の必要な文字位置に「%」または「_」が含まれているかどうかを明示的にテストできます。 拡張文字は 、1 つの SBCS (1 バイト) 文字または 1 つの DBCS (2 バイト) 文字からなります。 ESCAPE 文節は、Unicode 混合 (UTF-8) データには許されますが 、ASCII および EBCDIC の混合データには制限があります。

この式は、以下によって指定できます。

  • 定数
  • 変数
  • 引数が上記のいずれかであるスカラー関数 (ただし、 ネストされた関数呼び出しは使用できない)
  • その引数が上記のいずれかであるような CAST の指定

以下の規則は、この節およびエスケープ表現の使用にも適用されます。 ESCAPE 句およびエスケープ表現の使用にも適用されます

  • escape-expression の結果は、1 つの SBCS 文字 または DBCS 文字あるいは、1 バイトのみを含むバイナリー・ストリングでなければなりません。
  • この ESCAPE match-expression が混合データの場合、この節は使用できません。
  • escape-expression がホスト変数によって指定されている場合、ホスト変数は、固定長ストリング・ホスト変数の宣言規則に従って定義する必要があります。
    :NUL文字で終端されている場合は、長さ2のC文字列変数を指定できます。
    ホスト変数が負の標識変数を持っている場合、述部の結果は不明です。
  • パターンには、エスケープ文字「%」または「_」が後に続く場合を除いて、エスケープ文字を含めることはできません。たとえば、「+」がエスケープ文字の場合、パターン内で「++」、「+_」、または「+%」以外の「+」が出現するとエラーになります。
下表は、拡張文字 (このケースでは正符号 (+)) が連続して現れる場合の効果を示しています。
表 1. エスケープ文字が連続して現れる場合の効果
パターン・ストリング 実際のパターン
+% パーセント記号
++% 1 つの正符号の後に 0 個または 1 つ以上の任意文字
+++% 1 つの正符号の後に 1 つの % 記号を続けたもの

例 1
次の述語は、NAMEでテストされる文字列がSMITH、NESMITH、SMITHSON、NESMITHYのいずれかの値を持つ場合に真となります。 ストリングの値が SMYTHE の場合は、真ではありません。
  NAME LIKE '%SMITH%'
例 2
以下の述語では、パターン用の文字列を保持するホスト変数PATTERNが定義されています
  NAME LIKE :PATTERN ESCAPE '+'
PATTERN の中のストリングが以下の値を持つものとします。
  AB+_C_%

このストリングでは、最初の下線の前に置かれた正符号が 拡張文字であることに注意してください。 NAME の中のテストするストリングの値が AB_CD または AB_CDE の 場合に、この述部は真となります。 このストリングの値が AB、AB_、または AB_C の場合には、偽です。

例 3
次の2つの述語は等価であり、最初の述語の4つのパーセント記号のうち3つは冗長である。
  NAME LIKE 'AB%%%%CD'
  NAME LIKE 'AB%CD'
例 4
ソース・データ・タイプが CHAR(5) の ZIP_TYPE という名前の特殊タイプ が存在し、ある表 TABLEY にデータ・タイプが ZIP_TYPE の ADDRZIP 列が 存在するものと想定します。 以下のステートメントは、 郵便番号 (ADDRZIP) が「9555」で始まる行を選択します。
  SELECT * FROM TABLEY
    WHERE CHAR(ADDRZIP) LIKE '9555%'
例 5
サンプルテーブルDSN8D10.EMP_PHOTO_RESUME のRESUME列はCLOBとして定義されています。 以下のステートメントは 、ストリング JONES が RESUME 列内のどこかに存在する場合に、その列を選択します。
  SELECT RESUME FROM DSN8D10.EMP_PHOTO_RESUME
    WHERE RESUME LIKE '%JONES%'
例 6

以下の表では、 COL1 がEBCDICデータが混在する列であると仮定します。 この表は、2 列目の COL1 値を使用して 1 列目の述部を評価 した場合の結果を示しています。

図の説明の開始 この表は、述部が COL1 の値 (EBCDIC) によって評価されるときの結果を示しています。 追加の説明には、表の文字表現が含まれています。
例 7
以下の表では、 COL1 が ASCII データが混在する列であると仮定します。 この表は、2 列目の COL1 値を使用して 1 列目の述部を評価 した場合の結果を示しています。
図の説明の開始 この表は、述部が COL1 の値 (ASCII) によって評価されるときの結果を示しています。 追加の説明には、表の文字表現が含まれています。
例 8
以下の表において、 COL1 がUnicodeデータを含む列であると仮定します。 この表は、2 列目の COL1 値を使用して 1 列目の述部を評価 した場合の結果を示しています。
表 2. COL1 に含まれる Unicode データ
述部 COL1 の値 結果
WHERE COL1 LIKE 'aaaAB%C 'aaaABDZC' はい
'aaaABdzxC' はい
空ストリング いいえ
WHERE COL1 LIKE 'aaaAB %C' 'aaaABDZC' はい
'aaaABdzxC' はい
空ストリング いいえ
WHERE COL1 LIKE ' ' 'aaaABDZC' いいえ
'aaaABdzxC' いいえ
空ストリング はい
WHERE COL1 LIKE ' %' 'aaaABDZC' はい
'aaaABdzxC' はい
空ストリング はい
WHERE COL1 LIKE '        %' 'aaaABDZC' はい
'aaaABdzxC' はい
空ストリング いいえ
WHERE COL1 LIKE '        ' 'aaaABDZC' いいえ
'aaaABdzxC' いいえ
空ストリング いいえ

LIKE blank insignificant 動作サブシステム・パラメーター

LIKE_BLANK_INSIGNIFICANT サブシステム・パラメーターが有効な場合、固定長ストリングの末尾にあるブランクはすべて無視されます。 この動作は、LIKE blank insignificant 動作と呼ばれます。 固定長ストリング末尾のブランクが必須である (無視されない) LIKELIKE blank significant 動作は、インストールまたはマイグレーション時のデフォルト動作です。 可変長ストリングの場合はブランクが意味を持ちます。

LIKE_BLANK_INSIGNIFICANT サブシステム・パラメーターを設定した場合、LIKE 述部を持つ SQL 照会ステートメントをバウンドまたは準備してから、そのステートメントを次回実行する時に、LIKE blank insignificant 動作が有効になります。 ステートメントが準備もバインドもされていない場合、サブシステム・パラメーターの設定に関係なく、LIKE の動作は LIKE blank significant 動作を示します。

以下のインターフェースでは、LIKE blank insignificant 動作を有効または無効にすると、即時に有効になります。 これは、明示的な LIKE 述部 (UNLOAD など) と暗黙的な LIKE 述部 (表チェック制約など) の両方に適用されます。

  • INSERT
  • UPDATE
  • MERGE
  • UNLOAD
  • REORG
  • LOAD
  • CHECK DATA

LIKE 述部が適用される前に、CHARACTER 列または GRAPHIC 列内のすべての末尾ブランクは、最後の非ブランク文字までストリップされます。 列に含まれるのがすべてブランクの場合、文字位置 1 のブランクはストリップされません。 ストリップ後、LIKE 述部はストリップされた列データに対して適用されます。

ヒント : LIKE_BLANK_INSIGNIFICANTサブシステム・パラメータを有効にした後、既存の行がLIKE述語を含むテーブル・チェック制約に準拠しない場合があります。 影響を受けるすべての表で CHECK DATA ユーティリティーを実行し、表チェック制約に準拠しないレコードを検出することを検討してください。

以下の例 (b はブランク文字を表します) は、LIKE blank insignificant 動作が有効な場合の LIKE 述部の評価方法を示しています。

SELECT C1
FROM T1
WHERE C1 LIKE '%xyz';

この LIKE 述部は以下の固定長ストリングと一致します。

  • abcxyz
  • abcxyzb
  • abcxyzbb
  • abcxyzbb..b'

列データの末尾ブランクは意味を持ちませんが、LIKE 述部の末尾ブランクは意味を持ちます。 以下の例 (b はブランク文字を表します) は、LIKE 述部に 1 つ以上の末尾ブランクが含まれている場合に適用されます。

SELECT C1
FROM T1
WHERE C1 LIKE '%xyzbb';

この LIKE 述部は以下の固定長ストリングと一致しません。

  • abcxyz
  • abcxyzb
  • abcxyzbb
  • abcxyzbbb

以下の例は、LIKE 述部の最終位置に 1 つ以上の単一文字 (_) が含まれている場合に適用されます。

SELECT C1
FROM T1
WHERE C1 LIKE '%xyz_';

以下の固定長ストリングはすべてストリップされて「abcxyz」ストリングになるため、上記の LIKE 述部はこれらと一致しません。

  • abcxyz
  • abcxyzb
  • abcxyzbb
  • abcxy zbb..b

以下の例は、LIKE 述部の最終位置に複数の単一文字 (_) が含まれている場合に適用されます。

SELECT C1
FROM T1
WHERE C1 LIKE '%xyz__';

この LIKE 述部は以下の固定長ストリングと一致しません。

  • abcxyz
  • abcxyzb
  • abcxyzbb
  • abcxy zbb..b

以下の例は、LIKE 述部に複数の単一文字 (_) が含まれており、ゼロ個以上の文字のストリング (%) が最終位置にある場合に適用されます。

SELECT C1
FROM T1
WHERE C1 LIKE '%xyz_%_';
This

この LIKE 述部は以下の固定長ストリングと一致しません。

  • abcxyz
  • abcxyzb
  • abcxyzbb
  • abcxy zbb..b

列データに含まれているのがすべてブランクの場合、文字位置 1 のブランクを除くすべてのブランクは LIKE 述部が適用される前にストリップされます。 例えば、CHAR(6) 列に以下の値が含まれているとします。

BBBBBB

以下の LIKE 述部はこれと一致します。

  • b ' のような
  • LIKE '_'
  • LIKE '%'

以下の LIKE 述部はこれと一致しません。

  • 「bbbbbbb」 に「いいね」
  • 「bbbb___」 を「いいね」
  • LIKE '_______'