Perché 0 è uguale a stringa vuota?


23

Ho bisogno di aiuto per scoprire perché la seguente T-SQLdichiarazione ritorna 1(vera):

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

Immagino che qualcuno abbia cambiato ANSIun'opzione simile SET ANSI_NULLSo qualcos'altro che sta causando il comportamento.

Il mio problema è che sto unendo alcuni valori e nel set di righe finali ho valori che sono uniti da 0e ''valori, che non è corretto.

Risposte:


31

Questo è solo un comportamento documentato. Non credo che nessuno abbia incasinato le impostazioni.

Vedere la precedenza del tipo di dati su MSDN.

Quando un operatore combina due espressioni di diversi tipi di dati, le regole per la precedenza del tipo di dati specificano che il tipo di dati con la precedenza inferiore viene convertito nel tipo di dati con la precedenza più alta.

Come notato nei commenti, la stringa vuota viene convertita in 0 in qualsiasi tipo numerico e in 1900-01-01 00: 00: 00.000 quando viene convertita in una data.

EDIT: penso che il tuo vero problema sia che il tuo design è tale che devi unirti a campi di un diverso tipo di dati. L'unico modo per aggirare il problema è di eseguire una conversione nella clausola di join che comprometterà le prestazioni della query. Il problema principale è probabilmente con la progettazione dello schema

EDIT: C'è stata molta discussione nei commenti che sono stati spostati in chat. Per quanto illogico possa sembrare, la conversione di una stringa vuota in altri tipi di dati produce valori arbitrari.

Questo codice:

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

Produce questo output:

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

Potresti quindi aspettarti che questo comportamento sia coerente tra altri tipi di dati precedenti e che la conversione di 0 in una data produrrebbe lo stesso valore arbitrario, ma non lo è.

SELECT CONVERT(date, 0)

produce

La conversione esplicita dal tipo di dati int ad oggi non è consentita.

Perché non è una conversione supportata

mentre

SELECT CONVERT(datetime, 0)

ritorna

01 gennaio 1900 00:00:00

Quindi sì, è strano e arbitrario, ma in realtà documentato e spiegabile.


I commenti non sono per una discussione estesa; la conversazione su questa risposta è stata spostata nella chat .
Paul White dice GoFundMonica

2
Il comportamento CAST('' AS INT)-> 0 è documentato da qualche parte? Sarebbe bello se aggiungi un riferimento.
Salman A

2
@SalmanA: dovrebbe essere documentato nella sezione "Conversione dei dati dei caratteri" della documentazione char / varchar , ma attualmente non lo è. Ho lasciato un commento di feedback chiedendo che fosse incluso.
Heinzi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.