2017-12-12 4 views
2

0の代わりにNULLが返される理由は?T-SQL NULLIFがNULLにNULLを返します。

DECLARE @number BIGINT = 0; 

SELECT NULLIF(@number, ''); 

MSDNによると、それは0を返す必要があります:指定された2つの式が等しい場合

NULLIF
はnull値を返します。

SQLサーバーの場合、0''は同じ(=等しい)と見なされますか?何が背後にあるロジックですか?

+0

meta-dupe:[なぜ0は空文字列と同じですか?](https://dba.stackexchange.com/questions/101884/why-0-is-equal-to-empty-string) –

+0

可能な複製[0とSQL Server 2012の空白文字列の比較](https://stackoverflow.com/questions/25142303/sql-server-2012-blank-string-comparison-with-0) –

答えて

0

これは、暗黙的な変換の結果です。場合によっては、文字列値を整数に変換することもできます(空の文字列を0に変換するなど)。

SQL Serverは、基本的に2つの式のデータ型を一致させようとしてから、値をチェックします。

DECLARE @number BIGINT = 0; 

SELECT 
    CONVERT(BIGINT, '') 
    , NULLIF(@number, '') 
    , NULLIF(@number, CONVERT(BIGINT, '')) 
1

BOL状態として、「データ型の優先順位のルールはより低い優先順位のデータ型がより高い優先順位のデータ型に変換されることを指定します。」 bigintnvarcharの2種類のデータ型があります。 2つを比較するには、同じデータ型でなければなりません。記載されたルールに従って、nvarcharは暗黙的にbigintに変換されます。 select convert(bigint, '')を試してみると、結果は0になります。だから彼らは同じです。

0

''は、データ型の方が優先度が高いため、0の整数に変換されています。 ''0

SELECT CONVERT(INT, '') -- 0 
SELECT CAST('' AS INT) -- 0 
0

になる方法を以下の例を確認してください。このスクリプトはnullを返す必要があり、それは本当です! その理由は ''は文字列なので、今のように整数と比較すると暗黙的に整数値にキャストされます! 一般に、異なるデータ型の値を比較するときには、暗黙の変換がシーンの背後で行われるため、問題を抱えています。

関連する問題