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?
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, '%', '[%]') + '%'
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.
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.
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
Select * from table where name like search_criteria
si vous attendez de l'utilisateur qu'il ajoute ses propres caractères génériques ...
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 .
Échapper au signe de pourcentage \%
pour en faire une partie de votre valeur de comparaison.
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