Dr.Sumには文字列データを加工するための関数がたくさん用意されています。例えば「2024/12/31」の文字列データを「31/12/2024」に入れ替える場合、方法はいくつかありますが、次のように書くことができます。
SELECT DAY(TO_DATE('2024/12/31', 'YYYY/MM/DD'))
|| '/' || MONTH(TO_DATE('2024/12/31', 'YYYY/MM/DD'))
|| '/' || YEAR(TO_DATE('2024/12/31', 'YYYY/MM/DD'));
上記の例ではいくつか関数を組み合わせていますが、正規表現関数を使うことでより簡単に加工を行うことができます。本記事では、複雑なパターンに対してもシンプルな記述で加工ができる正規表現関数について紹介します!
正規表現の使い方については、検索するとたくさん記事が出てきます。使いこなせるようになるとより加工の幅が広がります。電話番号にマッチする正規表現の例なども検索で出てきますし、今は生成AIに聞いてみるのも手かもしれませんね。
正規表現関数を使うとどれくらい楽になる?
冒頭の例については次章で触れるので詳細は省きますが、「2024/12/31」を「31/12/2024」に入れ替える場合は下記のように書けます。
-- 実行結果:'31/12/2024'
SELECT REGEXP_REPLACE('2024/12/31', '(\d{4})/(\d{1,2})/(\d{1,2})', '\3/\2/\1');
こちらの’\3/\2/\1’の指定は「後方参照」と呼ばれる便利な手法です。次章の「REGEXP_REPLACE」節で詳しく紹介しているのでぜひご一読ください!
別の例としてDr.SumのマニュアルのURLからドメイン部分(‘cs.wingarc.com’)を抽出することを考えてみます。
方法はいくつかありますが、スラッシュ区切りであることに着目して、INSTR関数とSUBSTR関数を使ってみます。案の定かなり長い記述になってしまいましたね。
-- 実行結果:cs.wingarc.com
SELECT SUBSTRING('https://cs.wingarc.com/manual/drsum/5.7/index.html'
,INSTR('https://cs.wingarc.com/manual/drsum/5.7/index.html','/',1,2) + 1
,INSTR('https://cs.wingarc.com/manual/drsum/5.7/index.html', '/', 1, 3)
- INSTR('https://cs.wingarc.com/manual/drsum/5.7/index.html', '/', 1, 2) - 1
);
正規表現関数を使うと次のようにシンプルに書けます。
-- 実行結果:cs.wingarc.com
SELECT REGEXP_REPLACE('https://cs.wingarc.com/manual/drsum/5.7/index.html','^https?://([^/]+).*','\1');
正規表現関数の使いどころと便利なポイント
Ver. 5.7.00.0030時点では以下の5つの正規表現関数が使えます。
- REGEXP_REPLACE
- REGEXP_INSTR
- REGEXP_COUNT
- REGEXP_LIKE
- REGEXP_SUBSTR
このうち、いくつかピックアップして、使いどころと便利なポイントについて説明していきます。
REGEXP_COUNT
REGEXP_COUNTは、指定した文字列データに対して、正規表現にマッチする回数を取得する関数です。
例えば、英語の文章から単語の数を数える場合に利用できます。
-- 実行結果:12
SELECT REGEXP_COUNT("This is sample sentense in English to show how to use REGEXP_COUNT.", "\b[a-zA-Z\'-]+");
正規表現を使わず、シンプルに特定文字の数を数える場合にもREGEXP_COUNTを使うことができます。SNSの投稿文中にあるハッシュタグ「#」の数を数える例です。
-- 実行結果:12
SELECT REGEXP_COUNT('こんにちは、みなさん!今日は、AI(人工知能)を活用した最新の自動化ツールを紹介します。このツールは、業務の効率化を支援するために、機械学習アルゴリズムを使用してタスクの自動化を行います。特に以下の分野で大きな効果を発揮します:
・データ入力と整理
・カスタマーサポートの効率化
・プロジェクト管理の自動化
さらに、このツールは直感的なインターフェースを持ち、わずか数クリックで設定を完了できます。特に中小企業にとって、業務の最適化が大きな助けになるでしょう。使い方はシンプルで、複雑なプログラミングスキルは不要です。
詳細はこちらのリンクでチェック!【リンク】
#AI #人工知能 #自動化 #機械学習 #効率化
#業務改善 #プロジェクト管理
#テクノロジー #ITソリューション #中小企業
#カスタマーサポート #データ管理', "#");
REGEXP_LIKE
REGEXP_LIKEは、指定した文字列データに対して、正規表現にマッチする箇所があるか否かを判定する関数です。この関数は文字列の加工というよりは、WHERE句で抽出条件として利用します。
通常、複数条件や前方一致などを行う場合は「WHERE カラム名 IN 条件」と記述できますが、正規表現を使うことで、金額など数値データに対してn桁のものを抽出、文字型のデータに対して範囲検索などより自由度高く指定できる点が魅力です。
-- 100 ~ 100000 のうち、4桁のデータのみ抽出
SELECT N AS 数値データ FROM GENERATE_SERIES ( 100, 100000 ) N WHERE REGEXP_LIKE(N,'^[0-9]{4}$') = 1;
コード情報など文字型ではあるが数値の連番として扱われるものを範囲検索するときは、都度数値に変換したりといった手間が省けて便利です。
-- 社員コードの00010~00099までを抽出
SELECT 社員コード FROM 社員マスタ WHERE REGEXP_LIKE(社員コード, '000[1-9][0-9]') = 1;
REGEXP_REPLACEと後方参照
REGEXP_REPLACEは、指定した文字列データに対して、正規表現にマッチした箇所を別の文字へ変換する関数です。
冒頭の加工について考えてみます。「2024/12/31」のように年月日が「yyyy/mm/dd」のフォーマットになっているものを「dd/mm/yyyy」など任意の順序に並び替える場合にREGEXP_REPLACEが便利です。
-- 実行結果:'31/12/2024'
SELECT REGEXP_REPLACE('2024/12/31', '(\d{4})/(\d{1,2})/(\d{1,2})', '\3/\2/\1');
第二引数と第三引数に焦点をあてつつ、グループ化による後方参照について併せて紹介します。
- 第二引数: ‘(\d{4})/(\d{1,2})/(\d{1,2})’
‘\d’は半角の数値を表し、さらに’\d{4}’とすると半角数字が4つ並んでいる文字列にマッチします。それらが丸かっこ'()’で囲まれグループ化されています。シンプルに丸かっこ内の正規表現をまとめる効果がありますが、もう一つ後方参照と呼ばれる操作が可能になります。
- 第三引数: ‘\3-\2-\1’
第二引数では年月日それぞれでマッチするよう(\d{4})、(\d{1,2})、(\d{1,2})の3つのグループ化がされています。第三引数では、左から1番目のグループを\1、左から2番目のグループを\2、といった形で参照することができます。これを後方参照といい、年・月・日といった数値の羅列をそれぞれのパーツとして自由に入れ替えることが可能です。
前章で紹介した、Dr.SumのマニュアルのURLからドメインを取得するケースでもこの後方参照を使っています。
-- 実行結果:cs.wingarc.com
SELECT REGEXP_REPLACE('https://cs.wingarc.com/manual/drsum/5.7/index.html','^https?://([^/]+).*','\1');
‘http(s)://’以降の文字列に対して’/’区切りでグループ化し、その一番目のグループを指定することでドメインを取得しています。
さいごに
正規表現関数を使うことで、複雑な文字列パターンに対しても柔軟に加工・抽出が可能です。生データのままでは扱いづらい時、正規表現関数が使えないか検討してみてくださいね。