LIKE句で角括弧をエスケープするにはどうすればよいですか?
-
22-07-2019 - |
質問
likeを使用してストアドプロシージャでアイテムをフィルタリングしようとしています。列はvarchar(15)です。フィルタリングしようとしているアイテムの名前に角かっこが含まれています。
例: WC [R] S123456
。
LIKE 'WC [R] S123456'
を実行しても、何も返されません。
LIKE
で ESCAPE
キーワードを使用する方法についての情報を見つけましたが、角括弧を通常の文字列として扱うための使用方法がわかりません。
解決
LIKE 'WC[[]R]S123456'
または
LIKE 'WC\[R]S123456' ESCAPE '\'
動作するはずです。
他のヒント
リテラル its [brac] et
に一致させたいとしましょう。
[
とペアになっている場合にのみ特別な意味を持つため、]
をエスケープする必要はありません。
したがって、問題を解決するには [
で十分です。 > [[] 。
アンダースコアで始まる名前をクエリから除外する必要があったため、最終的には次のようになりました。
WHERE b.[name] not like '\_%' escape '\' -- use \ as the escape character
実際に使用したものは次のとおりです。
like 'WC![R]S123456' ESCAPE '!'
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 '\'
私の場合のように '_' (アンダースコア)のような特殊文字をエスケープする必要があり、ESCAPE句を定義できない場合、または定義できない場合は、特殊文字を角括弧 '[' および ']' で囲む。
これは" weird"の意味を説明しています。文字列 '[[]' -単に '[' 文字を角括弧で囲み、効果的にエスケープします。
私のユースケースは、プロファイラーのフィルター条件としてアンダースコアを含むストアドプロシージャの名前を指定することでした。そこで、文字列 '%name [_] of [_] a [_] stored [_] procedure%' をTextData LIKEフィールドに入れて、達成したい結果をトレースしました。
これはドキュメントからの良い例です: LIKE(Transact-SQL)-ワイルドカード文字をリテラルとして使用する
ワイルドカードパターンマッチング文字をリテラルとして使用できます 文字。ワイルドカード文字をリテラル文字として使用するには、 ワイルドカード文字を角かっこで囲みます。
これらの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
「\」またはキーボード上の別の文字の代わりに、キーボード上にない特殊文字を使用することもできます。ユーザーの入力を誤ってエスケープ文字として使用したくない場合は、ユースケースに応じてこれが必要になる場合があります。
フォローを使用
そのまま検索するユーザー入力の場合は、エスケープを使用します。すべての特殊文字を置換する必要があります(以下ではすべてのSQL Serverについて説明します)。
ここで一重引用符" '"文字列の連結の問題であるため、like句に影響を与えないため、とられません。
"-" & " ^" & "]" " ["をエスケープするため、replaceは不要です。
String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");
次に、SQLクエリでは次のようになります。 (パラメーター化されたクエリでは、上記の置換後にパターンを使用して文字列を追加できます。)
正確な文字列を検索するには。
like 'FormattedString' ESCAPE 'ð'
文字列で始まる検索
like '%FormattedString' ESCAPE 'ð'
文字列で末尾を検索するには
like 'FormattedString%' ESCAPE 'ð'
文字列で含むを検索するには
like '%FormattedString%' ESCAPE 'ð'
他のパターンマッチングの場合はなど。ただし、直接のユーザー入力は上記のようにフォーマットする必要があります。