7.20.5 LIKE_REGEX述語
正規表現を使用してデータを検索する際にLIKE_REGEX述語を使用します。
(1) 指定形式
LIKE_REGEX述語::=一致値 〔NOT〕 LIKE_REGEX 正規表現文字列 〔FLAG {I|IGNORECASE}〕 一致値::=値式 正規表現文字列::=文字列定数
(2) 指定形式の説明
- 一致値:
-
検索対象のデータを値式の形式で指定します。値式については,「7.21 値式」を参照してください。
一致値には,CHAR型またはVARCHAR型のデータを指定してください。
- NOT:
-
NOTを指定した場合,指定した正規表現文字列によって表現される文字列の要素を含まない文字列が検索対象になります。
- 正規表現文字列:
-
正規表現を文字列定数の形式で指定します。文字列定数については,「6.3 定数」を参照してください。
正規表現文字列の長さは,1,024バイト以下にしてください。
正規表現文字列は次の形式で指定します。
正規表現::={〔正規項〕|正規表現 垂直棒 正規表現} 正規項::={正規因子|正規項 正規因子} 正規因子::={正規一次子|正規一次子 *|正規一次子 +|正規一次子 ? |正規一次子 繰り返し因子} 繰り返し因子::=左波括弧 下限値 〔,〔上限値〕〕右波括弧 正規一次子::={文字指定子|文字クラス|.|^|$|正規文字集合|(正規表現)} 文字指定子::={エスケープされない文字|エスケープされた文字} 正規文字集合::={[文字列挙…]|[^文字列挙…]} 文字列挙::={文字指定子|文字指定子 - 文字指定子|正規文字集合識別子指定} 正規文字集合識別子指定::=[:正規文字集合識別子:]
正規表現の規則を次の表に示します。
表7‒10 正規表現の規則 項番
正規表現
意味
1
文字指定子
長さ1(文字数)の文字列を意味します。
2
.(ピリオド)
長さ1(文字数)の任意の文字を意味します。
3
^(サーカムフレックス)
一致値の先頭を意味します。一致値に改行が含まれている場合,改行後の先頭は対象になりません。
正規文字集合を意味する角括弧の中に^を指定した場合は,列挙された文字を除く任意の文字を意味します。
4
$(ドル記号)
一致値の末尾を意味します。一致値に改行が含まれている場合,改行前の行末は対象になりません。
5
正規一次子*
直前の正規一次子の,0回以上の繰り返しを意味します。
6
正規一次子+
直前の正規一次子の,1回以上の繰り返しを意味します。
7
正規一次子?
直前の正規一次子の,0回または1回の繰り返しを意味します。
8
正規表現 垂直棒 正規表現
垂直棒の左右に指定した正規表現のうちのどちらかを意味します。
9
正規一次子{n}
正規一次子{n,m}
正規一次子{n,}
直前の正規一次子の繰り返しを意味します。繰り返し回数の指定方法と意味を次に示します。
{n}:直前の正規一次子のn回繰り返しを意味します。
{n,m}:直前の正規一次子のn回以上m回以下の繰り返しを意味します。
{n,}:直前の正規一次子のn回以上の繰り返しを意味します。
10
上限値
最小値0,最大値256の整数を意味します。
11
下限値
最小値0,最大値256の整数を意味します。
12
[文字列挙…]
列挙された文字のうちの任意の文字を意味します。
13
[^文字列挙…]
列挙された文字を除く任意の文字を意味します。
14
文字指定子1 - 文字指定子2
文字指定子1の文字から文字指定子2の文字までの,任意の文字(文字コードによる範囲)を意味します。
半角英大文字と半角英小文字を区別しない検索を指定した場合(FLAG IまたはFLAG IGNORECASEを指定した場合),指定した文字コードの範囲,指定した文字コードの範囲にある半角英小文字を半角英大文字に変換したもの,および指定した文字コードの範囲にある半角英大文字を半角英小文字に変換したものを意味します。
15
正規文字集合識別子
alpha
任意の半角英大文字(\,@,#を除く),または半角英小文字を意味します。[a-zA-Z]と同じ意味です。
16
upper
任意の半角英大文字(\,@,#を除く)を意味します。[A-Z]と同じ意味です。
17
lower
任意の半角英小文字を意味します。[a-z]と同じ意味です。
18
digit
任意の数字を意味します。[0-9]と同じ意味です。
19
alnum
任意の半角英大文字(\,@,#を除く),半角英小文字,または数字を意味します。[a-zA-Z0-9]と同じ意味です。
20
space
半角スペース,タブ,キャリッジリターン,ラインフィード,垂直タブ,または改ページ文字を意味します。
21
blank
半角スペースまたはタブを意味します。
22
cntrl
制御文字を意味します。0x00〜0x1fのどれかか,または0x7fを意味します。
23
graph
0x21〜0x7eのどれかを意味します。
24
print
0x20〜0x7eのどれかを意味します。
25
punct
1バイト0x7e以下の記号文字を意味します。[!-/\:-@\[-`\{-~]と同じ意味です。
26
xdigit
16進文字を意味します。[a-fA-F0-9]と同じ意味です。
27
文字クラス
\d
任意の数字を意味します。[0-9]と同じ意味です。
28
\D
数字以外を意味します。[^0-9]と同じ意味です。
29
\w
任意の半角英大文字(\,@,#を除く),半角英小文字,数字,および下線文字(_)を意味します。[a-zA-Z0-9_]と同じ意味です。
30
\W
「半角英大文字(\,@,#を除く),半角英小文字,数字,および下線文字(_)」以外を意味します。[^a-zA-Z0-9_]と同じ意味です。
31
\s
半角スペース,タブ,キャリッジリターン,ラインフィード,垂直タブ,または改ページ文字を意味します。
32
\S
「半角スペース,タブ,キャリッジリターン,ラインフィード,垂直タブ,および改ページ文字」以外を意味します。
33
\A
一致値の先頭を意味します。
34
\Z
一致値の末尾を意味します。
- FLAG {I|IGNORECASE}:
-
半角英大文字(\,@,#を除く)と半角英小文字を区別しない検索をする場合に指定します。
IまたはIGNORECASEのどちらを指定しても,同じ処理が実行されます。
なお,HADBサーバで使用している文字コードがShift-JISの場合,このオプションは指定できません。
(3) 正規表現の指定例
正規表現の代表的な指定例を次の表に示します。
項番 |
項目 |
正規表現の指定 |
意味 |
正規表現の指定例 |
検索対象となる文字列 |
---|---|---|---|---|---|
1 |
前方一致 |
^nnn |
文字列の先頭部分が「nnn」である |
^ACT |
ACT,ACTOR,ACTION など,ACTで始まる文字列 |
2 |
後方一致 |
nnn$ |
文字列の最後の部分が「nnn」である |
ING$ |
ING,BEING,HAVINGなど,INGで終わる文字列 |
3 |
任意一致 |
nnn |
文字列中の任意の部分に「nnn」を含む |
Sun |
Sun,Sunday,Sundaysなど,Sunを含む文字列 |
4 |
完全一致 |
^nnn$ |
文字列が「nnn」と同じ |
^EQUAL$ |
EQUAL |
5 |
部分一致 |
.nnn. |
文字列中の特定の部分が「nnn」と同じであり,その前後の部分に任意の文字がある |
.I. |
BIT,HIT,KITなど,3文字で2文字目がIである文字列 |
6 |
1回以上の繰り返し |
mmm[0-9]+ または mmm[[:digit:]]+ |
文字列中の任意の部分に「mmm」があり,「mmm」の後ろに任意の数字がある |
KFAA[0-9]+ または KFAA[[:digit:]]+ |
KFAA123,KFAA11104-E,KFAA11901-Eなど,KFAAで始まり,その後ろが任意の数字の文字列 |
7 |
幾つかの文字の選択 |
^mmm.*(n|o) または ^mmm.*[no] |
文字列の先頭部分が「mmm」であり,i文字目がnまたはoである(iは任意の数字)。 |
^KFAA.*(W|E) または ^KFAA.*[WE] |
KFAA20008-Wや,KFAA11901-Eなど,KFAAで始まり,その後ろにWまたはEの文字を含む文字列 |
8 |
n回の繰り返し |
mmm{n} |
文字列の先頭部分が「mmm」であり,最後の文字をn回繰り返す |
123{3} |
12333 |
(4) 述語の評価
指定した一致値の値が,正規表現文字列の表現する文字列の集合の要素を含む場合に真となります。そうでない場合は偽となります。ただし,正規表現文字列の長さが0の場合,一致値がナル値以外のときに真となります。
NOTを指定したときは,指定した一致値の値が,正規表現文字列の表現する文字列の要素を含まない場合に真となります。そうでない場合は偽となります。ただし,正規表現文字列の長さが0の場合,一致値がナル値以外のときに偽となります。
一致値がナル値の場合,述語は不定となります。
(5) 規則
(a) 一致値に関する規則
-
一致値に?パラメタを単独で指定した場合,?パラメタに仮定されるデータ型はVARCHAR(32000)になります。
(b) エスケープ文字に関する規則
-
正規表現文字列中に\がある場合,その\はエスケープ文字として扱われます。
-
エスケープ文字の直後が特殊文字の場合,その特殊文字は通常文字と見なされます。特殊文字を次に示します。
-
. (ピリオド)
-
* (アスタリスク)
-
+ (正符号)
-
? (疑問符)
-
| (垂直棒)
-
( (左括弧)
-
) (右括弧)
-
{ (左波括弧)
-
} (右波括弧)
-
[ (左角括弧)
-
] (右角括弧)
-
\ (円記号)
-
- (負符号)※
-
: (コロン)※
-
^ (サーカムフレックス)
-
$ (ドル記号)
注※ 文字列挙の中に指定した場合に限り特殊文字として扱われます。
-
-
エスケープ文字の直後が通常文字の場合,そのエスケープ文字は読み飛ばされます。
-
エスケープ文字の後ろに文字がない場合,そのエスケープ文字は読み飛ばされます。
-
エスケープ文字が2つ連続している場合,2つ連続しているエスケープ文字は通常文字1文字と見なされます。
(6) 性能面の考慮点
テキストインデクスを定義している場合,正規表現中のリテラル文字を使用して,テキストインデクスによるページの絞り込みが行われます。そのため,LIKE述語やスカラ関数CONTAINSと同様に,正規表現中のリテラル文字が「a」または「0」などの単純で短い文字の場合は,テキストインデクスによるページの絞り込みの効果が少なくなります。また,パターンを表すメタ文字(丸括弧,角括弧,量指定子)は,組み合わせのパターン数が増加すると,テキストインデクスによるページの絞り込みに時間が掛かるため,検索時にテキストインデクスが使用されません。
そのため,パターンを表すメタ文字を使用しないと,テキストインデクスによるページの絞り込みの効果を上げることができます。例えば,HADBとHiRDBの2つの条件で検索する場合,「H(A|iR)DB」と指定するよりも,「HADB | HiRDB」と指定した方が,テキストインデクスによるページの絞り込みが効きます。
また,繰り返し因子でも,「(abc){1,3}」と指定するよりも,「abc | abcabc | abcabcabc 」と指定した方が,テキストインデクスによるページの絞り込みが効きます。
(7) 例題
- 例題
-
表T_MSGのMSG列中のデータで,文字列がKFAA30で始まり,そのあとに数字が3つ続き,-Eで終わる行を検索します。
SELECT * FROM "T_MSG" WHERE "MSG" LIKE_REGEX 'KFAA30[0-9]{3}-E'
下線部分がLIKE_REGEX述語の指定です。
上記のLIKE_REGEX述語の指定では,例えば,「KFAA30101-E」の文字列が対象になります。