0
の代わりにNULL
が返される理由は?T-SQL NULLIFがNULLにNULLを返します。
DECLARE @number BIGINT = 0;
SELECT NULLIF(@number, '');
MSDNによると、それは0
を返す必要があります:指定された2つの式が等しい場合
NULLIF
はnull値を返します。
SQLサーバーの場合、0
と''
は同じ(=等しい)と見なされますか?何が背後にあるロジックですか?
0
の代わりにNULL
が返される理由は?T-SQL NULLIFがNULLにNULLを返します。
DECLARE @number BIGINT = 0;
SELECT NULLIF(@number, '');
MSDNによると、それは0
を返す必要があります:指定された2つの式が等しい場合
NULLIF
はnull値を返します。
SQLサーバーの場合、0
と''
は同じ(=等しい)と見なされますか?何が背後にあるロジックですか?
演算子が異なるデータ型の2つの式を結合する場合、データ型の優先順位の規則は、優先順位の低いデータ型が優先順位の高いデータ型に変換されるように指定します。
SELECT CONVERT(bigint, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
0
0
1900-01-01
https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-precedence-transact-sql
これは、暗黙的な変換の結果です。場合によっては、文字列値を整数に変換することもできます(空の文字列を0に変換するなど)。
SQL Serverは、基本的に2つの式のデータ型を一致させようとしてから、値をチェックします。
DECLARE @number BIGINT = 0;
SELECT
CONVERT(BIGINT, '')
, NULLIF(@number, '')
, NULLIF(@number, CONVERT(BIGINT, ''))
BOL状態として、「データ型の優先順位のルールはより低い優先順位のデータ型がより高い優先順位のデータ型に変換されることを指定します。」 bigint
とnvarchar
の2種類のデータ型があります。 2つを比較するには、同じデータ型でなければなりません。記載されたルールに従って、nvarchar
は暗黙的にbigint
に変換されます。 select convert(bigint, '')
を試してみると、結果は0
になります。だから彼らは同じです。
''
は、データ型の方が優先度が高いため、0
の整数に変換されています。 ''
が0
SELECT CONVERT(INT, '') -- 0
SELECT CAST('' AS INT) -- 0
になる方法を以下の例を確認してください。このスクリプトはnullを返す必要があり、それは本当です! その理由は ''は文字列なので、今のように整数と比較すると暗黙的に整数値にキャストされます! 一般に、異なるデータ型の値を比較するときには、暗黙の変換がシーンの背後で行われるため、問題を抱えています。
meta-dupe:[なぜ0は空文字列と同じですか?](https://dba.stackexchange.com/questions/101884/why-0-is-equal-to-empty-string) –
可能な複製[0とSQL Server 2012の空白文字列の比較](https://stackoverflow.com/questions/25142303/sql-server-2012-blank-string-comparison-with-0) –