web-dev-qa-db-ja.com

検索条件に「%」が含まれる「%」を使用したSQL「LIKE」クエリ

以下のようなSQLクエリがあります。

Select * from table 
where name like '%' + search_criteria + '%' 

Search_criteria = 'abc'の場合、xxxabcxxxxを含むデータが返されますが、これは問題ありません。

ただし、search_criteria = 'abc%'の場合、xxxabcxxxを含むデータが返されますが、これは当てはまりません。

この状況にどのように対処しますか?

33
pratik

%search_criteriaシンボルをワイルドカードとしてではなくリテラル文字として処理する場合は、[%]にエスケープします

... where name like '%' + replace(search_criteria, '%', '[%]') + '%'
29
Alex K.

最も簡単な解決策は、「ライク」を完全に省くことです。

Select * 
from table
where charindex(search_criteria, name) > 0

私はcharindexが好きです。歴史的には、パフォーマンスは向上していましたが、今では大きな違いを生むかどうかはわかりません。

12
Gordon Linoff

エスケープ句を使用します。

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句の特殊文字のリスト を参照してください

9
Glenn

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で始まり%で終わるすべてのサプライヤーを返します。たとえば、「He​​llo%」などの値を返します。

SQL LIKE条件では、エスケープ文字と_文字を使用することもできます。

例えば:

SELECT *
FROM suppliers
WHERE supplier_name LIKE 'H%!_' escape '!';

このSQL LIKE条件の例は、名前がHで始まり_で終わるすべてのサプライヤーを返します。たとえば、「He​​llo_」などの値を返します。


参照: sql/like

4
IgniteCoders
Select * from table where name like search_criteria

ユーザーが独自のワイルドカードを追加することを期待している場合...

2
Randy

これをエスケープする必要があります。多くのデータベースでは、バックスラッシュ\%を前に付けることでこれを行います。

したがって、abcabc\%になります。

プログラミング言語には、これを行うためのデータベース固有の機能があります。たとえば、 PHP には MySQL データベースのmysql_escape_string()があります。

2
Harald Brinkhof

パーセント記号\%をエスケープして、比較値の一部にします。

0
Sean

これが助けになるかもしれません:)

DECLARE @SearchCriteria VARCHAR(25)
SET  @SearchCriteria = 'employee'
IF CHARINDEX('%', @SearchCriteria) = 0
BEGIN
SET @SearchCriteria = '%' + @SearchCriteria + '%'
END
SELECT * 
FROM Employee
WHERE Name LIKE @SearchCriteria
0
Kapil Malhotra