varchar
s y la igualdad son espinosas en TSQL. El LEN
función dice:
Devuelve el número de caracteres, en lugar del número de bytes, de la expresión de cadena dada, excluyendo los espacios en blanco .
Necesitas usar DATALENGTH
para obtener un verdadero byte
recuento de los datos en cuestión. Si tiene datos Unicode, tenga en cuenta que el valor que obtenga en esta situación no será el mismo que la longitud del texto.
print(DATALENGTH(' ')) --1
print(LEN(' ')) --0
Cuando se trata de la igualdad de expresiones, las dos cadenas se comparan para la igualdad como esta:
- Obtener cadena más corta
- Bloc con espacios en blanco hasta que la longitud sea igual a la de una cadena más larga
- Compara los dos
Es el paso intermedio el que está causando resultados inesperados:después de ese paso, está comparando efectivamente espacios en blanco contra espacios en blanco, por lo tanto, se ven como iguales.
LIKE
se comporta mejor que =
en la situación de "espacios en blanco" porque no realiza el relleno en blanco en el patrón que estaba tratando de hacer coincidir:
if '' = ' '
print 'eq'
else
print 'ne'
Dará eq
mientras:
if '' LIKE ' '
print 'eq'
else
print 'ne'
Dará ne
Cuidado con LIKE
aunque:no es simétrico:trata los espacios en blanco finales como significativos en el patrón (RHS) pero no en la expresión de coincidencia (LHS). Lo siguiente está tomado de aquí:
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