SQLiteのlike
ステートメントで下線文字が何をするのかわかりません。ワイルドカード文字、%
は、おそらく他のほとんどのSQLデータベースと同じです。
それで、いまいましい_
キャラクターは?
アンダースコアも他のほとんどの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 を使用します。
LIKE
式での標準SQLです:
%
は、空の文字列を含む文字列に一致します。正規表現の.*
と同等です。_
は単一の文字に一致します。正規表現の.
と同等です。%
、_
およびそれ自体をエスケープするための文字を選択するには、次のようにします。
... WHERE expr LIKE 'a_b%c\\d\%\_' ESCAPE '\'
これはa×b×××c\d%_
またはa×bc\d%_
と一致しますが、abc\d%_
もa×b×××cd%_
とは一致しません。
さらにSQLiteには、%
が*
になり、_
が?
になることを除いて、まったく同じように動作するGLOB
キーワードがあります。
@Benoitの回答の補遺:
ESCAPE
は、すべてのLIKE
式ではなく、最新のLIKE
式に適用されます。すべてをエスケープするには、以下のようにESCAPE
を複数回使用する必要があります。
WHERE foo LIKE '%bar^%%' ESCAPE '^' AND foo LIKE '%baz^_%' ESCAPE '^'
この述部は、bar%またはbazと任意の文字を含むfoo
の値に一致します。
記録のために、私はXCode/Objective-C環境で使用していますが、「\」は機能しません。代わりに他のものを使用してください...
バックスラッシュ文字を使用したCスタイルのエスケープは、標準のSQLではないためサポートされません( https://www.sqlite.org/lang_expr.html )