LIKE句で角括弧をエスケープするにはどうすればよいですか?


236

likeを使用して、ストアドプロシージャでアイテムをフィルター処理しようとしています。列はvarchar(15)です。フィルタリングしようとしているアイテムの名前には角かっこがあります。

例: WC[R]S123456

私が行う場合、LIKE 'WC[R]S123456'それは何も返しません。

でのESCAPEキーワードの使用に関するいくつかの情報を見つけましたLIKEが、角かっこを通常の文字列として扱うためにそれを使用する方法がわかりません。

回答:


328
LIKE 'WC[[]R]S123456' 

または

LIKE 'WC\[R]S123456' ESCAPE '\'

うまくいくはずです。


10
ESCAPEキーワードは、カスタムエスケープ文字を使用する場合に必要です(バックスラッシュは実際にカスタムです)。
ライアンコーン

2
答えの残りの部分も修正しました。SQL Fiddleの前のバージョンと後のバージョン
Martin Smith

10
ブラケットをエスケープする必要がある理由が不明な場合は、LIKEドキュメントに、ブラケットが範囲またはセットの単一の文字と一致するために使用されていることが示されています。たとえば、using LIKE '[fz]oo'は「foo」と「zoo」の両方に一致します。
Holistic Developer

3
これらの両方の理由を答えに含めるとよいでしょう。以下のAmiteshからの回答を読むまで、最初の例が機能する理由はすぐにはわかりませんでした。
Don Jewett、

1
好むLIKE 'WC\[R]S123456' ESCAPE '\'それはメンテナンスのために、より読みやすいよう。
Fire Druid、

119

リテラルと一致させたいとしましょうits[brac]et

]とペアになって[いる場合にのみ特別な意味があるため、をエスケープする必要はありません。

したがって[、問題を解決するには、エスケープで十分です。[ 置き換えることで エスケープでき[[]ます。


7
これは本当に役に立ち、imoが最良の答えでした。
Jared Sol

1
[[]奇妙に見えますが、パーサーの観点から見ると理にかなっています。パーサーには、間の文字を処理する方法に関する特定のルールがあります[ ]。だから、テキストits[brac]et手段は:「次の連続した文字列を検索しますits(角括弧のルールを適用しますbrac)、et。一方、its[[]brac]et手段は:「次の連続した文字列を検索しますits(角括弧のルールを適用します[)、brac]et
ブライアン

28

アンダースコアで始まる名前をクエリから除外する必要があったので、次のようになりました。

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character

2
私はこのバージョン(「エスケープ」文字を明示的に指定)を使用する必要がありました-ここでの他の回答では、正しい結果が得られませんでした。
MarcE


15

ESCAPEキーワードは、通常ワイルドカードである%や_などの特殊文字を検索する必要がある場合に使用されます。ESCAPEを指定すると、SQLは文字%および_を文字どおり検索します。

ここにいくつかの例を含む良い記事があります

SELECT columns FROM table WHERE 
    column LIKE '%[[]SQL Server Driver]%' 

-- or 

SELECT columns FROM table WHERE 
    column LIKE '%\[SQL Server Driver]%' ESCAPE '\'

6

私の場合のように'_'(アンダースコア)のような特殊文字をエスケープする必要があり、ESCAPE句を定義できない、または定義できない場合は、特殊文字を大括弧'[で囲むことができます。 'および'] '

これは、「奇妙な」文字列「[[]」の意味を説明します- 角括弧で「[」文字を囲み、事実上エスケープします。

私の使用例は、アンダースコアが含まれるストアドプロシージャの名前をプロファイラーのフィルター条件として指定することでした。したがって、文字列'%name [_] of [_] a [_] stored [_] procedure%'をTextData LIKEフィールドに入れて、達成したいトレース結果が得られました。

以下は、ドキュメントの良い例です 。LIKE(Transact-SQL)-リテラルとしてのワイルドカード文字の使用


4

ドキュメントによると:

ワイルドカードパターンマッチング文字をリテラル文字として使用できます。ワイルドカード文字をリテラル文字として使用するには、ワイルドカード文字を角かっこで囲みます。

これらの3つの文字をエスケープする必要があります%_[

'5%'      LIKE '5[%]'      -- true
'5$'      LIKE '5[%]'      -- false
'foo_bar' LIKE 'foo[_]bar' -- true
'foo$bar' LIKE 'foo[_]bar' -- false
'foo[bar' LIKE 'foo[[]bar' -- true
'foo]bar' LIKE 'foo]bar'   -- true

1

「\」またはキーボードの別の文字の代わりに、キーボードにない特殊文字を使用することもできます。ユースケースによっては、ユーザー入力を誤ってエスケープ文字として使用したくない場合に、これが必要になることがあります。


2
私はよく使用します。¬これは英国ではキーボードの文字ですが、意識的に使用されることはめったにありません:)(Escとの間の左上Tab
Andi Mohr

ユーザーは、キーボードにない文字を含むデータを送信できます。この回答は、実際に問題を解決しないようにするための提案のように疑わしく聞こえます...
binki 2018

0

以下を使用してください。

ユーザー入力をそのまま検索するには、エスケープを使用します。すべての特殊文字を以下のように置き換える必要があります(以下はすべてのSQL Serverをカバーしています)。

ここでは、単一引用符 "'"は文字列連結の問題であるため、like句には影響しないため、使用していません。

「-」と「^」と「]」は、「[」をエスケープしているため、置換する必要はありません。

String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");

次に、SQLクエリでは次のようになります。(パラメーター化されたクエリでは、文字列は上記の置換後にパターンで追加できます)。

正確な文字列を検索します。

like 'FormattedString' ESCAPE 'ð'

文字列で検索を開始するには

like '%FormattedString' ESCAPE 'ð'

文字列で末尾を検索するには

like 'FormattedString%' ESCAPE 'ð'

文字列を含むを検索するには

like '%FormattedString%' ESCAPE 'ð'

他のパターンマッチングについても同様です。ただし、直接ユーザー入力は、上記のようにフォーマットする必要があります。


0

その間に問題があります:

LIKE 'WC[[]R]S123456' 

そして:

LIKE 'WC\[R]S123456' ESCAPE '\'

どちらもSQL Serverでは機能しますが、Oracleでは機能しません。

左中かっこを含むパターンを認識するISO / IEC 9075の方法はないようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.