web-dev-qa-db-fra.com

Comment trouver '%' avec l'opérateur LIKE dans SQL Server?

J'ai un nom de colonne Address qui consiste en une adresse qui contient '%' entre:

Address
--------------------
Aman Ja%lan%
Stree% Ro%ad

etc.

Comment puis-je écrire l'opérateur LIKE pour trouver ce modèle?

J'ai essayé:

declare @var char(1)
set @var='!%'
select Address from Accomodation where Address like '%'+@var+'%'
32
Teju MB

J'utiliserais

WHERE columnName LIKE '%[%]%'

SQL Server stocke des statistiques récapitulatives sur les chaînes à utiliser pour estimer le nombre de lignes qui correspondront à une clause LIKE. Les estimations de cardinalité peuvent être meilleures et conduire à un plan plus approprié lorsque la syntaxe entre crochets est utilisée.

La réponse à cet élément de connexion indique

Nous ne prenons pas en charge l'estimation précise de la cardinalité en présence de caractères d'échappement définis par l'utilisateur. Nous avons donc probablement une mauvaise estimation et un mauvais plan. Nous envisagerons de résoudre ce problème dans une prochaine version.

Un exemple

CREATE TABLE T
(
X VARCHAR(50),
Y CHAR(2000) NULL
)

CREATE NONCLUSTERED INDEX IX ON T(X)

INSERT INTO T (X)
SELECT TOP (5) '10% off'
FROM master..spt_values
UNION ALL
SELECT  TOP (100000)  'blah'
FROM master..spt_values v1,  master..spt_values v2


SET STATISTICS IO ON;
SELECT *
FROM T 
WHERE X LIKE '%[%]%'

SELECT *
FROM T
WHERE X LIKE '%\%%' ESCAPE '\'

Affiche 457 lectures logiques pour la première requête et 33 335 pour la seconde.

41
Martin Smith

Vous pouvez utiliser ESCAPE:

WHERE columnName LIKE '%\%%' ESCAPE '\'
19
John Woo

Essaye ça:

declare @var char(3)
set @var='[%]'
select Address from Accomodation where Address like '%'+@var+'%' 

Vous devez utiliser [] pour annuler l’effet du caractère générique. Vous devez donc lire% comme caractère normal, idem à propos du caractère _

2
Joe Taras