0が空の文字列と等しいのはなぜですか?


23

次のT-SQLステートメントが返される理由1(true)を見つけるには、助けが必要です。

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

誰かが動作の原因となっているANSIオプションなどを変更したと思いますSET ANSI_NULLS

私の問題は、いくつかの値を結合していることです。最終行セットには、結合される値0''値がありますが、これは正しくありません。

回答:


31

これは文書化された動作です。誰も設定を台無しにしたとは思わない。

MSDNのデータ型の優先順位を参照してください。

演算子が異なるデータ型の2つの式を結合する場合、データ型の優先順位の規則は、優先順位の低いデータ型が優先順位の高いデータ型に変換されることを指定します。

コメントに記載されているように、空の文字列は数値型では0に変換され、日付に変換されると1900-01-01 00:00:00.000に変換されます。

編集:あなたの本当の問題は、あなたのデザインが異なるデータ型のフィールドに参加しなければならないということだと思います。これを回避する唯一の方法は、クエリのパフォーマンスを低下させるjoin句に変換を設定することです。主な問題はおそらくスキーマ設計にあります

EDIT:多くの議論がチャットに移動されているコメントでした。しかし、それが見えるかもしれません不合理、他のデータタイプに空の文字列を変換する任意の値を生成します。

このコード:

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

次の出力を生成します。

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

その場合、この動作は他の先行するデータ型間で一貫性があり、0を日付に変換すると同じ任意の値が生成されるが、そうではないと予測できます。

SELECT CONVERT(date, 0)

生産する

データ型intから日付への明示的な変換は許可されていません。

サポートされている変換ではないため

ながら

SELECT CONVERT(datetime, 0)

返品

1900年1月1日00:00:00

そうです、それは奇妙な、任意のですが、実際に文書化し、説明できます。


コメントは詳細なディスカッション用ではありません。この回答に関する会話はチャットに移動しました
ポールホワイトはGoFundMonicaを言う

2
動作CAST('' AS INT)-> 0はどこかに文書化されていますか?参照を追加するといいでしょう。
サルマンA

2
@SalmanA:char / varcharドキュメンテーションの「Converting Character Data」セクションに文書化する必要がありますが、現在はそうではありません。私はそれを含めるように頼むフィードバックコメントを残しました。
ハインツィ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.