sql-server - nullif - select coalesce sql server
¿Por qué T-SQL ISNULL() trunca la cadena y COALESCE no lo está? (3)
Dado lo siguiente:
SELECT ISNULL(''XY'' + NULL, ''ABCDEFGHIJ'') -- Outputs ABC (Why?)
SELECT COALESCE(''XY'' + NULL, ''ABCDEFGHIJ'') -- Outputs ABCDEFGHIJ
¿Por qué estas declaraciones están dando resultados diferentes?
Puedes ver toda la diferencia aquí, es muy claro.
MSDN: http://msdn.microsoft.com/en-us/library/ms190349.aspx
Blog de MSDN: http://blogs.msdn.com/b/sqltips/archive/2008/06/26/differences-between-isnull-and-coalesce.aspx
Según la documentation Microsoft, para función:
ISNULL(check_expression, replacement_value)
replacement_value
debe ser de un tipo que sea convertible implícitamente al tipo de check_expression
. Tenga en cuenta que el tipo para ''xy''+NULL
es VARCHAR(3)
. Debido a esto, su cadena ''ABCDEFGHIJ''
se VARCHAR(3)
en VARCHAR(3)
y, por lo tanto, se recorta.
Suena extraño por qué no es VARCHAR(2)
, pero así es, un carácter más largo que ''xy''
. Puedes jugar con este SQLFiddle y ver por ti mismo que el tipo para ''xy''+NULL
es el mismo que para la expresión CASE WHEN 1=2 THEN ''XYZ'' ELSE NULL END
, que es NULL
pero es implícitamente compatible con VARCHAR(3)
.
Parece que para la expresión ''xy''+NULL
la longitud percibida se puede calcular como ''xy''
longitud de cadena (2) más 1 por cada NULL
agregado. Por ejemplo, el tipo de ''xy''+NULL+NULL
es VARCHAR(4)
, el tipo de ''xy''+NULL+NULL+NULL
es VARCHAR(5)
y así sucesivamente: consulte este SQLFiddle . Esto es extremadamente extraño, pero así es como funcionan MS SQL Server 2008 y 2012.
ISNULL()
convierte el valor de reemplazo al tipo de la expresión de verificación. En este caso, el tipo de la expresión de verificación es CHAR(2)
, por lo que convertir el valor de reemplazo lo trunca (¿está seguro de que está obteniendo ABC
y no solo AB
?).
De la documentation Microsoft:
replacement_value
puede truncarse sireplacement_value
es más largo quecheck_expression
.