Por que 0 é igual a string vazia?


23

Preciso de ajuda para descobrir por que a seguinte T-SQLdeclaração retorna 1(true):

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

Eu acho que alguém mudou uma ANSIopção como SET ANSI_NULLSou qualquer outra coisa que está causando o comportamento.

Meu problema é que estou juntando alguns valores e, no conjunto de linhas final, tenho valores aos quais se juntam 0e ''valores, o que não está correto.

Respostas:


31

Esse é apenas um comportamento documentado. Eu não acho que alguém mexeu com as configurações.

Veja a precedência do tipo de dados no MSDN.

Quando um operador combina duas expressões de tipos de dados diferentes, as regras para a precedência do tipo de dados especificam que o tipo de dados com a precedência mais baixa é convertido no tipo de dados com a precedência mais alta.

Conforme observado nos comentários, a cadeia vazia é convertida em 0 em qualquer tipo numérico e em 1900-01-01 00: 00: 00.000 quando convertida em uma data.

Edição: Eu acho que seu problema real é que seu design é para que você tenha que ingressar em campos de um tipo de dados diferente. A única maneira de contornar isso é fazer uma conversão na cláusula de junção, o que prejudicará o desempenho da consulta. O principal problema provavelmente está no design do esquema

EDIT: Houve muita discussão nos comentários que foram movidos para o bate-papo. Por mais ilógico que possa parecer, a conversão de uma string vazia em outros tipos de dados produz valores arbitrários.

Este código:

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

Produz esta saída:

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

Você pode esperar que esse comportamento seja consistente entre outros tipos de dados anteriores e que a conversão de 0 em uma data produza o mesmo valor arbitrário, mas isso não ocorre.

SELECT CONVERT(date, 0)

Produz

A conversão explícita do tipo de dados int até a data não é permitida.

Porque não é uma conversão suportada

enquanto

SELECT CONVERT(datetime, 0)

Devoluções

01 de janeiro de 1900 00:00:00

Então, sim, é estranho e arbitrário, mas na verdade documentado e explicável.


Comentários não são para discussão prolongada; a conversa sobre esta resposta foi movida para o bate-papo .
Paul White diz GoFundMonica

2
O comportamento CAST('' AS INT)-> 0 está documentado em algum lugar? Seria bom se você adicionar referência.
Salman Um

2
@ SalmanA: Ele deve estar documentado na seção "Convertendo dados de caracteres" da documentação char / varchar , mas atualmente não é. Deixei um comentário solicitando sua inclusão.
Heinzi 29/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.