2010-08-04 6 views
2

J'ai un comportement intéressant que j'aimerais mieux comprendre afin que je ne me bloque pas par mégarde.L'échappement double d'un caractère générique dans SQL annule l'échappement?

Ce qui suit est un exemple d'échapper à un « % » dans une clause WHERE:

select * from #z where b like '%e%' ESCAPE 'e' 

Dans ce tableau avec les valeurs suivantes:

create table #z (a int, b varchar(10)) 
insert into #z values (1, 'e25%') 
insert into #z values (2, '25') 
insert into #z values (3, '18%') 
insert into #z values (4, 'cab') 
insert into #z values (5, '2%') 

sélectionne les trois rangées avec le% en fin.

Cependant, si je remplace like '%e%' par like 'ee%', il sélectionne uniquement la première ligne. Il semble donc que l'échappement double du% est comme un double négatif, et annule l'échappement, ramenant ainsi le% dans le caractère générique à nouveau. Est-ce que je comprends bien? Ou est-ce qu'il y a autre chose qui se passe ici?

Répondre

5

Je n'utilise pas vraiment ESCAPE: j'ai toujours trouvé ça bizarre. Dans ce cas, vous échapper au 2ème e si vous obtenez like 'e%' (sans issue)

Personnellement, j'utiliser ce like '%[%]' (sans issue), si possible

+0

C'est une belle une, @gbn . Le mettre dans ma boîte à outils pour une utilisation future. [clunk] – Cyberherbalist

2

Lorsque vous écrivez un caractère d'échappement, le caractère suivant après l'échappement est traité littéralement, et non avec sa signification particulière. Dans ce cas, le premier caractère qui suit l'échappement est 'e', ​​donc cela devient un 'e' littéral et non un caractère d'échappement comme il le serait autrement. Le même principe s'applique dans de nombreuses langues. Si vous voulez une barre oblique inversée, vous devez écrire deux barres obliques inverses - la première barre oblique inverse échappe à la seconde, de sorte qu'elle perd sa signification particulière.

Questions connexes