varchar
s en gelijkheid zijn netelig in TSQL. De LEN
functie zegt:
Retourneert het aantal tekens, in plaats van het aantal bytes, van de opgegeven tekenreeksexpressie, exclusief spaties aan het einde .
U moet DATALENGTH
. gebruiken om een echte byte
. te krijgen telling van de gegevens in kwestie. Als je unicode-gegevens hebt, houd er dan rekening mee dat de waarde die je in deze situatie krijgt niet hetzelfde is als de lengte van de tekst.
print(DATALENGTH(' ')) --1
print(LEN(' ')) --0
Als het gaat om gelijkheid van uitdrukkingen, worden de twee strings als volgt voor gelijkheid vergeleken:
- Kortere tekenreeks ophalen
- Pad met spaties totdat de lengte gelijk is aan die van een langere string
- Vergelijk de twee
Het is de middelste stap die onverwachte resultaten veroorzaakt - na die stap vergelijk je effectief witruimte met witruimte - vandaar dat ze als gelijk worden beschouwd.
LIKE
gedraagt zich beter dan =
in de "leeg"-situatie omdat het geen blanco opvulling uitvoert op het patroon dat u probeerde te matchen:
if '' = ' '
print 'eq'
else
print 'ne'
Geeft eq
terwijl:
if '' LIKE ' '
print 'eq'
else
print 'ne'
Geeft ne
Voorzichtig met LIKE
hoewel:het is niet symmetrisch:het behandelt de volgende witruimte als significant in het patroon (RHS) maar niet de match-expressie (LHS). Het volgende is hier overgenomen:
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