pontz_rwのブログ

プログラミング等の備忘録

LIKE と SIMILAR TO

文字列が指定されたパターンと一致するかどうかを判断するには、LIKESIMILAR 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

foobar に一致していないことが分かります。このように、正規表現LIKE で使用したワイルドカードを組み合わせてパターンに一致するか判断することができます。