Likeを使用してストアドプロシージャでアイテムをフィルターしようとしています。列はvarchar(15)です。フィルタリングしようとしているアイテムの名前に角かっこが含まれています。
例:WC[R]S123456
。
LIKE 'WC[R]S123456'
を実行すると、何も返されません。
ESCAPE
キーワードをLIKE
と共に使用することに関するいくつかの情報を見つけましたが、角括弧を通常の文字列として扱うために使用する方法がわかりません。
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句を定義する場合は、角かっこ '['および ']'で特殊文字を囲むことができます。 。
これは「奇妙な」文字列の意味を説明します '[[]'- '[' 角括弧付きの文字。効果的にエスケープします。
私の使用例は、プロファイラーのフィルター条件として、アンダースコアを含むストアドプロシージャの名前を指定することでした。だから私は文字列 '%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句に影響しないため、使用されません。
「-」と「^」と「]」は、「[」をエスケープするため、置換する必要はありません。
String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");
次に、SQLクエリで次のようになります。 (パラメータ化されたクエリでは、上記の置換後にパターンを使用して文字列を追加できます)。
正確な文字列を検索します。
like 'FormattedString' ESCAPE 'ð'
文字列で検索を開始するには
like '%FormattedString' ESCAPE 'ð'
文字列で終了を検索するには
like 'FormattedString%' ESCAPE 'ð'
文字列で含むを検索するには
like '%FormattedString%' ESCAPE 'ð'
他のパターンマッチングの場合も同様です。ただし、直接のユーザー入力は上記のようにフォーマットする必要があります。