web-dev-qa-db-ja.com

SQLite Like%および_

SQLiteのlikeステートメントで下線文字が何をするのかわかりません。ワイルドカード文字、%は、おそらく他のほとんどのSQLデータベースと同じです。

それで、いまいましい_キャラクターは?

56
Francisc

アンダースコアも他のほとんどのSQLデータベースと同じで、任意の1文字に一致します(つまり、正規表現の.と同じです)。 ファインマニュアル から:

LIKEパターンのアンダースコア( "_")は、文字列内の任意の1文字と一致します。

例えば:

-- The '_' matches the single 'c'
sqlite> select 'pancakes' like 'pan_akes';
1
-- This would need '__' to match the 'ca', only one '_' fails.
sqlite> select 'pancakes' like 'pan_kes';
0
-- '___' also fails, one too many '_'.
sqlite> select 'pancakes' like 'pan___kes';
0

そして、結果が理にかなっていることを確認するために、SQLiteは booleanにはゼロと1 を使用します。

62
mu is too short

LIKE式での標準SQLです:

  • %は、空の文字列を含む文字列に一致します。正規表現の.*と同等です。
  • _は単一の文字に一致します。正規表現の.と同等です。
  • %_およびそれ自体をエスケープするための文字を選択するには、次のようにします。

    ... WHERE expr LIKE 'a_b%c\\d\%\_' ESCAPE '\'
    

    これはa×b×××c\d%_またはa×bc\d%_と一致しますが、abc\d%_a×b×××cd%_とは一致しません。

さらにSQLiteには、%*になり、_?になることを除いて、まったく同じように動作するGLOBキーワードがあります。

82
Benoit

@Benoitの回答の補遺:

ESCAPEは、すべてのLIKE式ではなく、最新のLIKE式に適用されます。すべてをエスケープするには、以下のようにESCAPEを複数回使用する必要があります。

WHERE foo LIKE '%bar^%%' ESCAPE '^' AND foo LIKE '%baz^_%' ESCAPE '^'

この述部は、bar%またはbazと任意の文字を含むfooの値に一致します。

8
DuckMaestro

記録のために、私はXCode/Objective-C環境で使用していますが、「\」は機能しません。代わりに他のものを使用してください...

バックスラッシュ文字を使用したCスタイルのエスケープは、標準のSQLではないためサポートされません( https://www.sqlite.org/lang_expr.html

0
Jan ATAC