Pourquoi 0 est égal à une chaîne vide?


23

J'ai besoin d'aide pour trouver pourquoi l' T-SQLinstruction suivante renvoie 1(vrai):

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

Je suppose que quelqu'un a changé une ANSIoption comme SET ANSI_NULLSou quelque chose d'autre qui cause le comportement.

Mon problème est que je rejoins certaines valeurs et dans le dernier ensemble de lignes, j'ai des valeurs qui sont jointes par 0et des ''valeurs, ce qui n'est pas correct.

Réponses:


31

C'est juste un comportement documenté. Je ne pense pas que quiconque ait foiré les paramètres.

Voir la priorité du type de données sur MSDN.

Lorsqu'un opérateur combine deux expressions de types de données différents, les règles de priorité des types de données spécifient que le type de données avec la priorité la plus faible est converti en type de données avec la priorité la plus élevée.

Comme indiqué dans les commentaires, la chaîne vide est convertie en 0 dans n'importe quel type numérique et en 1900-01-01 00: 00: 00.000 lorsqu'elle est convertie en date.

EDIT: Je pense que votre vrai problème est que votre conception est telle que vous devez vous associer à des champs d'un type de données différent. La seule façon de contourner ce problème est d'avoir une conversion sur votre clause join qui nuira aux performances des requêtes. Le principal problème est probablement lié à la conception du schéma

EDIT: Il y a eu beaucoup de discussions dans les commentaires qui ont été déplacés vers le chat. Aussi illogique que cela puisse paraître, la conversion d'une chaîne vide en d'autres types de données produit des valeurs arbitraires.

Ce code:

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

Produit cette sortie:

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

Vous pouvez alors vous attendre à ce que ce comportement soit cohérent entre les autres types de données précédents et vous attendre à ce que la conversion de 0 en une date produise la même valeur arbitraire, mais ce n'est pas le cas.

SELECT CONVERT(date, 0)

Produit

La conversion explicite du type de données int à date n'est pas autorisée.

Parce que ce n'est pas une conversion prise en charge

tandis que

SELECT CONVERT(datetime, 0)

Résultats

01 janvier 1900 00:00:00

Alors oui, c'est bizarre et arbitraire, mais en fait documenté et explicable.


Les commentaires ne sont pas pour une discussion approfondie; la conversation sur cette réponse a été déplacée vers le chat .
Paul White dit GoFundMonica

2
Le comportement CAST('' AS INT)-> 0 est-il documenté quelque part? Ce serait bien si vous ajoutez une référence.
Salman A

2
@SalmanA: Cela devrait être documenté dans la section "Conversion des données de caractères" de la documentation de char / varchar , mais ce n'est pas le cas actuellement. J'ai laissé un commentaire de retour demandant qu'il soit inclus.
Heinzi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.