web-dev-qa-db-fra.com

Requête SQL 'LIKE' utilisant '%' où le critère de recherche contient '%'

J'ai une requête SQL comme ci-dessous.

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

Si search_criteria = 'abc', les données contenant xxxabcxxxx seront renvoyées, ce qui est correct.

Mais si mon search_criteria = 'abc%', il retournera toujours des données contenant xxxabcxxx, ce qui ne devrait pas être le cas.

Comment gérer cette situation?

33
pratik

Si vous voulez un % symbole dans search_criteria pour être traité comme un caractère littéral plutôt que comme un caractère générique, échappez-le à [%]

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

La solution la plus simple consiste à se passer de "comme", au total:

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

Je préfère le charindex comme. Historiquement, les performances étaient meilleures, mais je ne suis pas sûr que cela fasse une grande différence maintenant.

12
Gordon Linoff

Utilisez une clause d'échappement:

select *
  from (select '123abc456' AS result from dual
        union all
        select '123abc%456' AS result from dual
       )
  WHERE result LIKE '%abc\%%' escape '\'

Résultat

123abc%456

Vous pouvez définir votre personnage d'échappement à tout ce que vous voulez. Dans ce cas, la valeur par défaut '\'. Le '\%' échappé devient un littéral, le second '%' n'est pas échappé, donc encore une fois un joker.

Voir Liste des caractères spéciaux pour la clause SQL LIKE

9
Glenn

Pour échapper à un personnage de SQL, vous pouvez utiliser !:


EXEMPLE - UTILISATION DE CARACTÈRES D'ÉCHAPPEMENT

Il est important de comprendre comment "échapper des caractères" lors de la recherche de motif. Ces exemples traitent spécifiquement des caractères d'échappement dans Oracle.

Supposons que vous souhaitiez rechercher un caractère% ou _ dans la condition SQL LIKE. Vous pouvez le faire en utilisant un personnage d'échappement.

Veuillez noter que vous ne pouvez définir un caractère d'échappement que sous la forme d'un seul caractère (longueur de 1).

Par exemple:

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

Cet exemple de condition SQL LIKE identifie le! personnage comme un personnage d'échappement. Cette déclaration renverra tous les fournisseurs dont le nom est%.

Voici un autre exemple plus compliqué utilisant des caractères d'échappement dans la condition SQL LIKE.

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

Cet exemple de condition SQL LIKE renvoie tous les fournisseurs dont le nom commence par H et se termine par%. Par exemple, il renverrait une valeur telle que "Hello%".

Vous pouvez également utiliser le caractère d'échappement avec le caractère _ dans la condition SQL LIKE.

Par exemple:

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

Cet exemple de condition SQL LIKE renvoie tous les fournisseurs dont le nom commence par H et se termine par _. Par exemple, il renverrait une valeur telle que "Hello_".


Référence: sql/like

4
IgniteCoders
Select * from table where name like search_criteria

si vous attendez de l'utilisateur qu'il ajoute ses propres caractères génériques ...

2
Randy

Vous devez y échapper: sur de nombreuses bases de données, cela se fait en le faisant précéder d'une barre oblique inverse, \%.

Donc, abc devient abc\%.

Votre langage de programmation aura une fonction spécifique à la base de données pour le faire pour vous. Par exemple, PHP a mysql_escape_string () pour la base de données MySQL .

2
Harald Brinkhof

Échapper au signe de pourcentage \% pour en faire une partie de votre valeur de comparaison.

0
Sean

Peut-être que celui-ci aide :)

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