web-dev-qa-db-ja.com

ブラケット文字を含むSQL Server LIKE

SQL Server 2008を使用しています。次の列を持つテーブルがあります。

sampleData (nvarchar(max))

これらの行の一部のこの列の値は、次の形式のリストです。

["value1","value2","value3"]

このようにフォーマットされたリストを持つすべての行を返す単純なクエリを作成しようとしています。開始ブラケットを検出するだけです。

SELECT * from sampleTable where sampleData like '[%'

「[」は特殊文字であるため、上記のクエリは機能しません。また、私の人生では、ブラケットをエスケープする方法を見つけられないため、クエリは希望どおりに動作します。

提案をありがとう!

50
CJS
 ... like '[[]%'

あなたが使う [ ]特殊文字(または範囲)を囲む

SQL Server LIKE の「リテラルとしてのワイルドカード文字の使用」セクションを参照してください

編集、2011年11月24日

注:閉じ括弧をエスケープする必要はありません...

78
gbn

Gbnの答えは別として、他の方法はESCAPEオプションを使用することです:

SELECT * from sampleTable where sampleData like '\[%' ESCAPE '\'

詳細については documentation をご覧ください

29
Ed Harper

ここでさらに注意してください...ブラケット(またはその他の特殊文字)を文字セットに含める場合は、ESCAPEを使用するオプションしかありません(既にブラケットを使用してセットを示しているため)。また、デフォルトのエスケープ文字がないため、ESCAPE句を指定する必要があります(最初に思ったように、デフォルトではバックスラッシュではありませんが、Cの背景から来ています)。

例えば「許容可能な」文字のセットの外に列が含まれる行を引き出したい場合は、引数のために英数字としましょう...これから始めます

SELECT * FROM MyTest WHERE MyCol LIKE '%[^a-zA-Z0-9]%'

そのため、リストにない文字(先頭のキャレット^文字のため)を含むすべてのものを返します。

この許容文字セットに特殊文字を追加する場合は、角括弧をネストできないため、次のようにエスケープ文字を使用する必要があります...

SELECT * FROM MyTest WHERE MyCol LIKE '%[^a-zA-Z0-9\[\]]%' ESCAPE '\'

ブラケットの前に(個別に)バックスラッシュを付けて、エスケープ文字にバックスラッシュを使用していることを示すと、文字のセットを示す機能するブラケット内でエスケープできます。

愚かな例で申し訳ありませんが、それが誰かを助けることを願っています

3
KeithFearnley