以下のようなSQLクエリがあります。
Select * from table
where name like '%' + search_criteria + '%'
Search_criteria = 'abc'の場合、xxxabcxxxx
を含むデータが返されますが、これは問題ありません。
ただし、search_criteria = 'abc%'の場合、xxxabcxxx
を含むデータが返されますが、これは当てはまりません。
この状況にどのように対処しますか?
%
のsearch_criteria
シンボルをワイルドカードとしてではなくリテラル文字として処理する場合は、[%]
にエスケープします
... where name like '%' + replace(search_criteria, '%', '[%]') + '%'
最も簡単な解決策は、「ライク」を完全に省くことです。
Select *
from table
where charindex(search_criteria, name) > 0
私はcharindexが好きです。歴史的には、パフォーマンスは向上していましたが、今では大きな違いを生むかどうかはわかりません。
エスケープ句を使用します。
select *
from (select '123abc456' AS result from dual
union all
select '123abc%456' AS result from dual
)
WHERE result LIKE '%abc\%%' escape '\'
結果
123abc%456
エスケープ文字は任意に設定できます。この場合、デフォルトの「\」。エスケープされた「\%」はリテラルになり、2番目の「%」はエスケープされないため、再びワイルドカードになります。
SQL LIKE句の特殊文字のリスト を参照してください
SQLで文字をエスケープするには、!
を使用できます。
例-エスケープ文字の使用
パターンマッチング時に「文字をエスケープする」方法を理解することが重要です。これらの例は、特にOracleでのエスケープ文字を扱っています。
SQL LIKE条件で%または_文字を検索したいとしましょう。エスケープ文字を使用してこれを行うことができます。
エスケープ文字は1文字(長さ1)としてのみ定義できることに注意してください。
例えば:
SELECT *
FROM suppliers
WHERE supplier_name LIKE '!%' escape '!';
このSQL LIKE条件の例では、!エスケープ文字としての文字。このステートメントは、名前が%であるすべてのサプライヤーを返します。
SQL LIKE条件でエスケープ文字を使用するもう1つのより複雑な例を次に示します。
SELECT *
FROM suppliers
WHERE supplier_name LIKE 'H%!%' escape '!';
このSQL LIKE条件の例は、名前がHで始まり%で終わるすべてのサプライヤーを返します。たとえば、「Hello%」などの値を返します。
SQL LIKE条件では、エスケープ文字と_文字を使用することもできます。
例えば:
SELECT *
FROM suppliers
WHERE supplier_name LIKE 'H%!_' escape '!';
このSQL LIKE条件の例は、名前がHで始まり_で終わるすべてのサプライヤーを返します。たとえば、「Hello_」などの値を返します。
参照: sql/like
Select * from table where name like search_criteria
ユーザーが独自のワイルドカードを追加することを期待している場合...
パーセント記号\%
をエスケープして、比較値の一部にします。
これが助けになるかもしれません:)
DECLARE @SearchCriteria VARCHAR(25)
SET @SearchCriteria = 'employee'
IF CHARINDEX('%', @SearchCriteria) = 0
BEGIN
SET @SearchCriteria = '%' + @SearchCriteria + '%'
END
SELECT *
FROM Employee
WHERE Name LIKE @SearchCriteria