LIKE と SIMILAR TO
文字列が指定されたパターンと一致するかどうかを判断するには、LIKE
や SIMILAR TO
を使用します。
次のSamplesテーブルを使ってみていきましょう。
str |
---|
foo |
bar |
foobar |
Foo |
Bar |
Foobar |
FOO |
BAR |
FOOBAR |
-- サンプルデータ DROP TABLE IF EXISTS Samples ; CREATE TABLE Samples (str VARCHAR(10) PRIMARY KEY NOT NULL) ; INSERT INTO Samples VALUES ('foo'), ('bar'), ('foobar'), ('foobarfoo'), ('Foo'), ('Bar'), ('Foobar'), ('Foobarfoo'), ('FOO'), ('BAR'), ('FOOBAR'), ('FOOBARFOO') ;
検証には postgres 11.5 を使用しています。
LIKE
LIKE
は簡単なパターンと一致するかどうかを判断することができます。パターンには、次の2つのワイルドカードを使用することができます。
ワイルドカード | 意味 |
---|---|
% | 任意の0個以上の文字列 |
_ | 任意の1文字 |
'_'を使用した例
任意の1文字 + 'ar'
のパターンを持つ文字列を取得してみましょう。
SELECT str FROM Samples WHERE str LIKE '_ar'
結果は次の通りです。大文字と小文字は区別されるので BAR
は取得されません。
str |
---|
bar |
Bar |
'%'を使用した例
任意の0文字以上の文字 + 'bar'
のパターンを持つ文字列を取得してみましょう。
SELECT str FROM Samples WHERE str LIKE '%bar'
結果
str |
---|
bar |
foobar |
Foobar |
%
は任意の 0文字以上 の文字列に一致するかを判断するので、`bar にも一致します。
この例は所謂後方一致ですが、%
を使用することで前方一致や部分一致のパターンを取得できます。
bar
に対して前方一致する文字列を取得してみましょう。
SELECT str FROM Samples WHERE str LIKE 'bar%'
結果
str |
---|
bar |
bar
に対して部分一致する文字列を取得してみましょう。
str |
---|
bar |
foobar |
foobarfoo |
Foobar |
Foobarfoo |
文字列の中に bar
が含まれるものがすべて取得されています。
SIMILAR TO
SIMILAR TO
は、LIKE
で使用していたワイルドカードに加えて正規表現を用いてパターンと一致するか判断できます。
次のような特殊文字を使用することができます。
特殊文字 | 意味 |
---|---|
| | 二者択一 |
* | 直前の項目の0回以上の繰り返し |
+ | 直前の項目の1回以上の繰り返し |
? | 直前の項目の0回、もしくは1回の繰り返し |
{n[,m]} | 直前の項目のn回以上m回以下の繰り返し |
() | 項目を1つの単位としてグループ化 |
[...] | 括弧内の任意の文字 |
適当に見ていきましょう。
例えば、foo
もしくは bar
の後に任意の文字列が1文字以上というパターンに一致する文字列を取得してみましょう。
SELECT str FROM Samples WHERE str SIMILAR TO '(foo|bar)_%'
結果
str |
---|
foobar |
foobarfoo |
foo
と bar
に一致していないことが分かります。このように、正規表現とLIKE
で使用したワイルドカードを組み合わせてパターンに一致するか判断することができます。