varchar
se igualdade são espinhosos em TSQL. O LEN
função diz:
Retorna o número de caracteres, em vez do número de bytes, da expressão de string fornecida, excluindo espaços em branco à direita .
Você precisa usar
DATALENGTH
para obter um byte
verdadeiro contagem dos dados em questão. Se você tiver dados unicode, observe que o valor obtido nessa situação não será o mesmo que o comprimento do texto. print(DATALENGTH(' ')) --1
print(LEN(' ')) --0
Quando se trata de igualdade de expressões, as duas strings são comparadas para igualdade assim:
- Obtenha uma string mais curta
- Almofada com espaços em branco até que o comprimento seja igual ao da string mais longa
- Compare os dois
É a etapa do meio que está causando resultados inesperados - após essa etapa, você está comparando efetivamente o espaço em branco com o espaço em branco - portanto, eles são vistos como iguais.
LIKE
se comporta melhor que =
na situação de "brancos" porque não executa preenchimento em branco no padrão que você estava tentando corresponder:if '' = ' '
print 'eq'
else
print 'ne'
Dará
eq
enquanto:if '' LIKE ' '
print 'eq'
else
print 'ne'
Dará
ne
Cuidado com
LIKE
embora:não é simétrico:trata o espaço em branco à direita como significativo no padrão (RHS), mas não na expressão de correspondência (LHS). O seguinte é retirado daqui: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