¿Por qué 0 es igual a cadena vacía?

23

Necesito ayuda para encontrar por qué la siguiente T-SQLdeclaración devuelve 1(verdadero):

SELECT IIF( 0 = '', 1, 0)

Supongo que alguien ha cambiado una ANSIopción como SET ANSI_NULLSo algo más que está causando el comportamiento.

Mi problema es que estoy uniendo algunos valores y en el conjunto de filas final tengo valores que están unidos por 0y ''valores, que no es correcto.

gotqn
fuente

Respuestas:

31

Eso es solo un comportamiento documentado. No creo que nadie haya tenido problemas con la configuración.

Vea la precedencia del tipo de datos en MSDN.

Cuando un operador combina dos expresiones de diferentes tipos de datos, las reglas para la precedencia del tipo de datos especifican que el tipo de datos con la precedencia más baja se convierte al tipo de datos con la precedencia más alta.

Como se señaló en los comentarios, la cadena vacía se convierte a 0 en cualquier tipo numérico y a 1900-01-01 00: 00: 00.000 cuando se convierte en una fecha.

EDITAR: Creo que su verdadero problema es que su diseño es para que tenga que unirse en campos de un tipo de datos diferente. La única forma de evitar esto es tener una conversión en su cláusula de unión que perjudicará el rendimiento de la consulta. El problema principal es probablemente con el diseño del esquema.

EDITAR: Hubo mucha discusión en los comentarios que se movieron al chat. Por ilógico que parezca, la conversión de una cadena vacía a otros tipos de datos produce valores arbitrarios.

Este código:

SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')

Produce esta salida:

0
0
1900-01-01
1900-01-01 00:00:00.000

Podría esperar que este comportamiento sea coherente entre otros tipos de datos anteriores y esperar que convertir 0 a una fecha produzca el mismo valor arbitrario pero no lo hace.

SELECT CONVERT(date, 0)

Produce

La conversión explícita del tipo de datos int a la fecha no está permitida.

Porque no es una conversión compatible

mientras

SELECT CONVERT(datetime, 0)

Devoluciones

01 de enero de 1900 00:00:00

Entonces sí, es extraño y arbitrario, pero en realidad está documentado y es explicable.

Tom V - Equipo Mónica
fuente
Los comentarios no son para discusión extendida; La conversación sobre esta respuesta se ha trasladado al chat .
Paul White dice GoFundMonica
2
¿El comportamiento CAST('' AS INT)-> 0 está documentado en alguna parte? Sería bueno si agrega una referencia.
Salman A
2
@SalmanA: Debe documentarse en la sección "Conversión de datos de caracteres" de la documentación de char / varchar , pero actualmente no lo está. He dejado un comentario de retroalimentación pidiendo que se incluya.
Heinzi