varchar
s i równość są drażliwe w TSQL. LEN
funkcja mówi:
Zwraca liczbę znaków, a nie liczbę bajtów, danego wyrażenia ciągu, z wyłączeniem końcowych spacji .
Musisz użyć DATALENGTH
aby uzyskać prawdziwy byte
liczbę danych, o których mowa. Jeśli masz dane Unicode, pamiętaj, że wartość, którą otrzymasz w tej sytuacji, nie będzie taka sama jak długość tekstu.
print(DATALENGTH(' ')) --1
print(LEN(' ')) --0
Jeśli chodzi o równość wyrażeń, dwa ciągi są porównywane pod kątem równości w następujący sposób:
- Uzyskaj krótszy ciąg
- Podkładka z zaślepkami aż długość będzie równa długości dłuższego sznurka
- Porównaj te dwa
Jest to środkowy krok, który powoduje nieoczekiwane wyniki — po tym kroku skutecznie porównujesz białe znaki z białymi znakami — dlatego są one postrzegane jako równe.
LIKE
zachowuje się lepiej niż =
w sytuacji "puste", ponieważ nie wykonuje dopełniania pustym wzorcem, który próbujesz dopasować:
if '' = ' '
print 'eq'
else
print 'ne'
Da eq
podczas:
if '' LIKE ' '
print 'eq'
else
print 'ne'
Da ne
Ostrożnie z LIKE
chociaż:nie jest symetryczny:traktuje końcowe białe znaki jako istotne we wzorcu (RHS), ale nie jako wyrażenie dopasowania (LHS). Z tego miejsca pochodzi:
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