varchar
s och jämlikhet är svåra i TSQL. LEN
funktionen säger:
Returnerar antalet tecken, snarare än antalet byte, för det givna stränguttrycket, exklusive efterföljande blanksteg .
Du måste använda DATALENGTH
för att få en sann byte
antalet uppgifter i fråga. Om du har unicode-data, notera att värdet du får i den här situationen inte kommer att vara detsamma som längden på texten.
print(DATALENGTH(' ')) --1
print(LEN(' ')) --0
När det gäller likhet mellan uttryck jämförs de två strängarna för likhet så här:
- Få kortare sträng
- Pad med ämnen tills längden är lika med den längre strängen
- Jämför de två
Det är mittsteget som orsakar oväntade resultat – efter det steget jämför du effektivt blanksteg med blanksteg – därför ses de vara lika.
LIKE
beter sig bättre än =
i "blanks" situationen eftersom det inte utför blank-padding på mönstret du försökte matcha:
if '' = ' '
print 'eq'
else
print 'ne'
Ger eq
medan:
if '' LIKE ' '
print 'eq'
else
print 'ne'
Kommer att ge ne
Var försiktig med LIKE
dock:den är inte symmetrisk:den behandlar efterföljande blanksteg som signifikant i mönstret (RHS) men inte matchningsuttrycket (LHS). Följande är hämtat härifrån:
declare @Space nvarchar(10)
declare @Space2 nvarchar(10)
set @Space = ''
set @Space2 = ' '
if @Space like @Space2
print '@Space Like @Space2'
else
print '@Space Not Like @Space2'
if @Space2 like @Space
print '@Space2 Like @Space'
else
print '@Space2 Not Like @Space'
@Space Not Like @Space2
@Space2 Like @Space