2016-12-01 16 views
3

私はこのクエリを実行すると、私は結果が「偽」であることを期待T-SQLの予期しない動作

IF isnull(0,'') = '' 
     select 'true' 

else 
    select 'false' 

が、SQL Serverは、なぜ、「真」と言われますか?

+2

を返します(0、 '')は整数0を返し、2番目のオペランドを整数としてもチェックすると、select cast( ''は整数)、i tも0を返します。異なるタイプは使用しないでください。これは、この種の変換の問題で終了します。 –

+0

なぜこのような 'ISNULL()'を使うのですか?このようなコードを 'WHERE'または' SELECT'文で使用すると、ヌル値を何かに変換すると、テーブル全体が強制的にスキャンされます。これを 'SELECT'ステートメントで使用することはできません –

+0

@MarcGuillotしかし[this](https://connect.microsoft.com/SQLServer/feedbackdetail/view/347996/converting-an-empty-string-0-int)を読んでください。 -does-not-honor-round-trip-conversion-undocumented)。空の文字列を数値にキャストするとエラーが発生することを示します。 –

答えて

0

ISNULLは2つの値(NULLと0)がある場合は同じですので、IF条件でtrueになり、 'true'を選択すると印刷されます。

2

この場合、ISNULL(0,'')は整数を返します。 SQL Serverは2番目の引数を整数にもキャストします.0 = 0なので、結果はTRUEになります。直接0と比較すると、trueも返されます。

IF 0 = '' 
     select 'true' 

else 
    select 'false' 

このようにISNULLとNULLを使用すると、珍しいことです。 WHERE節のISNULL(someColumn='')機能を使用すると、オプティマイザはsomeColumnをカバーするインデックスを使用しないため、インデックスシークではなくスキャンが強制的に実行されます。

SELECTにIF文を使用することはできません。 CASE文であっても、そのような変換を適用するよりもNULLを明示的にチェックする方が良いでしょう。

+0

ok、説明のためにthx。私は "select cast( '' int)"を返し、0を返します – star

+0

@Starなぜあなたはこれをやっていますか?この「IF ISNULL」構造によって解決したい実際の問題は何ですか?おそらく、それを行うためのより簡単で速い方法があります –

2

2つの値を比較すると、最初に''intに変換されます。次

SELECT CONVERT(INT, '') 

戻り0、そう0=0はあなたがNULLとして0を扱いたい場合は、NULLIFを使用することができ、真の

です:

DECLARE @i INT = 0 
IF NULLIF(ISNULL(@i, ''), 0) = '' 
    SELECT 'true' 
ELSE 
    SELECT 'false' 

ISNULLのでこれは'false'