PL/SQL プログラミング入門(1) > LIKE、IN、BETWEEN AND、IS NULL

LIKE、IN 、BETWEEN、IS NULL 比較演算子

SQL および PL/SQL の両方において使用することができる演算子。

演算子内容
LIKEパターン比較
└ 正規表現による LIKEREGEXP_LIKE Oracle 10g
INメンバー比較 (SQL の = ANY 相当)
BETWEEN a AND ba 以上 b 以下の範囲テスト
IS NULLNULL かどうかをテスト
  • 以下の PL/SQL を SQL*Plus で実行する前には set serveroutput on を実行しておく。

LIKE 比較

パターンマッチング: '%' は0文字以上の任意文字にマッチする(※)。 '_' 文字は1文字の任意文字にマッチする。

(※) LIKE では パーセント('%' または 全角 '%') 、アンダースコア('_' または '_') の特殊記号を使用して前方一致(%〜)、後方一致(〜%)、部分一致(〜%〜)を記述することができる。 但し '%' を単独で使用した場合 「すべての文字列」 となるのであるが NULL および 「長さ0の文字列」 には該当しない。(NULL の仕様:Oracle 10g R2 時点)

LIKE には各国語キャラクタセットに使用する特定のコードポイント向けの演算子がある。

  • LIKEC : 完全な Unicode 用 (LIKEC はマルチバイト文字を1文字として扱う)
  • LIKE2 : UCS2 用
  • LIKE4 : UCS4 用
SQL> declare
  2     vstr    varchar2(10);
  3  begin
  4     vstr := '東京都';
  5     if (vstr LIKE '%京都%') then
  6             dbms_output.put_line('文字列に京都が含まれています');
  7     end if;
  8  end;
  9  /
文字列に京都が含まれています

'_' は1文字の任意の文字にマッチする

SQL> declare
  2     vstr    varchar2(10);
  3  begin
  4     vstr := '東京都';
  5     if (vstr LIKE '__都') then
  6             dbms_output.put_line('文字列は??都です');
  7     end if;
  8  end;
  9  /
文字列は??都です

ワイルドカード文字のエスケープ ESCAPE '任意文字'

SQL> declare
  2     vstr    varchar2(20);
  3  begin
  4     vstr := 'オレンジ100%ジュース';
  5     if (vstr LIKE '%\%%' ESCAPE '\') then
  6             dbms_output.put_line('文字列に%が含まれています');
  7     end if;
  8  end;
  9  /
文字列に%が含まれています

IN 比較

IN は 括弧を使っているので IN ファンクションと思われていることもあるかもしれないが item IN ( item_list ) に代表されるように二つの項を必要とする演算子である。

SQL> declare
  2     vstr    varchar2(10);
  3  begin
  4     vstr := '東京';
  5     if (vstr IN ('茨城','栃木','群馬','埼玉','千葉','東京')) then
  6             dbms_output.put_line('関東地方です');
  7     end if;
  8  end;
  9  /
関東地方です

複数項目のメンバーとのメンバーセットの比較は Oracle 10g 現在ではサポートされていない(SQL では可能)。

IN に指定できるリストは最大で 1000 個 ⇒ 参考:SQLの制限事項。副問い合わせの結果セットの件数には制限ない。

BEWEEN a AND b 比較

SQL> declare
  2     vnum    NUMBER;
  3  begin
  4     vnum := 5;
  5     if (vnum BETWEEN 1 AND 10) then
  6             dbms_output.put_line('NUMBER 変数は 1 以上 10 以下');
  7     end if;
  8  end;
  9  /
NUMBER 変数は 1 以上 10 以下

IS NULL または IS NOT NULL 比較

IS NULL に関しては特別で NOT を条件内に含む演算子を専用に持っている

SQL> declare
  2     vnum    NUMBER;
  3  begin
  4     if (vnum IS NULL) then
  5             dbms_output.put_line('NUMBER 変数は 初期化されていません');
  6     end if;
  7  end;
  8  /
NUMBER 変数は 初期化されていません


比較条件に関連する内容

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー