【Oracle】REGEXP_LIKEを使って特定の値を取得しよう!

Oracle

今回は、REGEXP_LIKE関数の使い方について説明します!※この記事を読むことで、特定のカラムに半角」「全角」「数値が含まれているか確かめ、対象のデータを取得することができるようになります

データ準備

REGEXP_LIKE関数を試すために、テーブルを作成しデータを追加します。

-- サンプルテーブルの作成
CREATE TABLE sample_table (
    id NUMBER PRIMARY KEY,
    checkcolumn VARCHAR2(100)
);

-- データ追加 
INSERT
  ALL INTO sample_table
VALUES
  (1, 'abc123')
INTO
  sample_table
VALUES
  (2, 'ABC123')
INTO
  sample_table
VALUES
  (3, '漢字')
INTO
  sample_table
VALUES
  (4, 'abcABC')
INTO
  sample_table
VALUES
  (5, '123456')
INTO
  sample_table
VALUES
  (6, 'abc')
INTO
  sample_table
VALUES
  (7, '')
SELECT
 *
FROM
  DUAL;
IDCHECKCOLUMN
1abc123
2ABC123
3漢字
4abcABC
5123456
6abc
7
サンプルデーブル

サンプルテーブルには、半角だけのレコード、全角だけのレコード、数値だけのレコード、半角全角の組み合わせたレコードがあります。では、REGEXP_LIKE関数を使ってそれぞれの値を取得してみましょう!

REGEXP_LIKE関数の使い方

半角(^[\x20-\x7E]+$)

REGEXP_LIKE関数半角が含まれているか確認する場合には、下記のように記述します。

WHERE REGEXP_LIKE(カラム名 , '^[\x20-\x7E]+$')
SELECT
  *
FROM
  sample_table
WHERE
  REGEXP_LIKE(checkcolumn, '^[\x20-\x7E]+$')
IDCHECKCOLUMN
5123456
半角が含まれているレコードを取得(?)

あれ、取得できてないレコードがある…

SELECT
  *
FROM
  sample_table
WHERE
-- ASCII 範囲内の文字を含むレコードを取得
  REGEXP_LIKE(checkcolumn, '[:ascii:]')
IDCHECKCOLUMN
1abc123
4abcABC
6abc
半角が含まれているレコードを取得

これで半角が含まれるレコードが正しく取得できました!

全角(^[^\x00-\x7F]+$)

REGEXP_LIKE関数全角が含まれているか確認する場合には、下記のように記述します。

WHERE REGEXP_LIKE(カラム名 , '^[^\x00-\x7F]+$')
SELECT
  *
FROM
  sample_table
WHERE
  REGEXP_LIKE(checkcolumn, '^[^\x00-\x7F]+$')
IDCHECKCOLUMN
2ABC123
3漢字
4abcABC
6abc
全角が含まれているレコードを取得(?)

あれ、半角が含まれている…

SELECT
  *
FROM
  sample_table
WHERE
-- ASCII範囲以外の文字が含まれるレコードを取得
  REGEXP_LIKE(checkcolumn, '[^ -~]')
IDCHECKCOLUMN
2ABC123
3漢字
4abcABC
全角が含まれているレコードを取得

これで全角が含まれるレコードが正しく取得できました!

数値(\d)

REGEXP_LIKE関数数値が含まれているか確認する場合には、下記のように記述します。

WHERE REGEXP_LIKE(カラム名 , '\d')
SELECT
  *
FROM
  sample_table
WHERE
  REGEXP_LIKE(checkcolumn, '\d')
IDCHECKCOLUMN
1abc123
2ABC123
5123456
数値が含まれているレコードを取得

数値が含まれているレコードはしっかり取得できてる!

まとめ

REGEXP_LIKE関数を使ってみましたが、どうやら少し癖があるようです。正規表現の書き方に注意しながら使ってみてください!

コメント