Db2 : SQLで正規表現(3)正規表現とLIKE・検索条件の記述


# 検索条件の記述：正規表現(REGEXP_LIKE)とLIKE


Db2 LUW（Linux,Unix and Windows版）ではV11.1以降、正規表現をSQL内で使うことができるようになっており、Oracle互換機能の一環として、Oracleと互換性のある[正規表現スカラー関数](https://www.ibm.com/docs/ja/db2/11.5?topic=sql-built-in-functions#r0011043__t11043-regexs)が使用できます。


正規表現を使うと、LIkEよりも的確な検索パターンを指定できるため、検索条件の記述を簡素化できる場合があります。

以下の例を、正規表現を使った場合とLIKEの場合で比較してみます

例：「郵便番号 100番」のうち、東京都千代田区以外の住所 ( 100-0100~0999, 100-1000~100-2999 )のみを検索



# 前準備1：Db2 on CloudとCSVデータの準備

IBM Cloud上にあるDb2はLiteプランを選択することで、無料で使用できます。学習用などに使用が可能です。

初めて使う方は、こちらの記事を参考にしてください。

+ [Db2 on CloudをLiteプラン(無料)で作成](https://qiita.com/nishikyon/items/0219a81673f0b84980da)


日本郵便から提供されている郵便番号データを取得します。
+ [郵便番号データダウンロード](https://www.post.japanpost.jp/zipcode/download.html)

今回は以下を使用しました。

+ [住所の郵便番号（ローマ字）（CSV形式）](https://www.post.japanpost.jp/zipcode/dl/roman-zip.html)




# 前準備2：Db2 on Cloudにテーブルを作ってデータをロード

- Db2 on Cloudでテーブルを作成

create tableし、郵便番号を索引とします。
```
--drop table yubin_number;

create table yubin_number(yubin_num char(7),prefname varchar(60),cityname varchar(100),townname varchar(200),r_prefname varchar(30),r_cityname varchar(50),r_townname varchar(100));

create index yubin_idx on yubin_number(yubin_num);
```

- CSVデータのロード

Db2 on Cloudのコンソールから「データのロード」の画面を使って、郵便番号データをロードします。

※ソース・データのコードページは「943(Shift-JIS)」を指定


![データのロード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272878/1e1cbba6-af5c-1b83-e875-542add7186d2.jpeg)

- 表の統計情報を更新します

```
CALL SYSPROC.ADMIN_CMD ('RUNSTATS ON TABLE yubin_number
  ON KEY COLUMNS and INDEXES ALL');
```

これで対象の表が用意できました。




# 検索条件の記述の比較


- REGEXP_LIKEでの記述例




```
SELECT yubin_num, prefname, cityname 
FROM yubin_number
WHERE REGEXP_LIKE (yubin_num, '^100[12]([0-9]{3})')
OR REGEXP_LIKE (yubin_num, '^1000[1-9]([0-9]{2})');
```



- LIKEでの記述例


```
SELECT yubin_num, prefname, cityname
FROM yubin_number
WHERE yubin_num LIKE '1001%'
OR yubin_num LIKE '1002%'
OR yubin_num LIKE '10001%'
OR yubin_num LIKE '10002%'
OR yubin_num LIKE '10003%'
OR yubin_num LIKE '10004%'
OR yubin_num LIKE '10005%'
OR yubin_num LIKE '10006%'
OR yubin_num LIKE '10007%'
OR yubin_num LIKE '10008%'
OR yubin_num LIKE '10009%';
```

- 実行結果はどちらも同じく以下となります。
```
YUBIN_NUM,PREFNAME,CITYNAME
------- -------- ----------
1000100 東京都    大島町
1000102 東京都    大島町
1000211 東京都    大島町
1000103 東京都    大島町
1000104 東京都    大島町
1000212 東京都    大島町
1000101 東京都    大島町
1000301 東京都    利島村
1000400 東京都    新島村
1000511 東京都    新島村
1000402 東京都    新島村
1000401 東京都    新島村
1000601 東京都    神津島村
1001100 東京都    三宅島　三宅村
1001212 東京都    三宅島　三宅村
1001103 東京都    三宅島　三宅村
1001102 東京都    三宅島　三宅村
1001213 東京都    三宅島　三宅村
1001101 東京都    三宅島　三宅村
1001211 東京都    三宅島　三宅村
1001301 東京都    御蔵島村
1001400 東京都    八丈島　八丈町
1001401 東京都    八丈島　八丈町
1001621 東京都    八丈島　八丈町
1001622 東京都    八丈島　八丈町
1001623 東京都    八丈島　八丈町
1001511 東京都    八丈島　八丈町
1001701 東京都    青ヶ島村
1002100 東京都    小笠原村
1002101 東京都    小笠原村
1002211 東京都    小笠原村


31 record(s) selected.

```







# 参考資料


- [Db2 11.5 Knowledge Center](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.welcome.doc/doc/welcome.html)

    - [正規表現の制御文字](https://www.ibm.com/docs/ja/db2/11.5?topic=sql-regular-expression-control-characters)
    - [正規表現スカラー関数](https://www.ibm.com/docs/ja/db2/11.5?topic=sql-built-in-functions#r0011043__t11043-regexs)




# 備考メモ

郵便番号の上2桁は、日本列島内で結構とびとびです。

https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E9%83%B5%E4%BE%BF%E7%95%AA%E5%8F%B7#/media/%E3%83%95%E3%82%A1[…]2_digit_postcode_japan.png