私はこのクエリを実行すると、私は結果が「偽」であることを期待T-SQLの予期しない動作
IF isnull(0,'') = ''
select 'true'
else
select 'false'
が、SQL Serverは、なぜ、「真」と言われますか?
私はこのクエリを実行すると、私は結果が「偽」であることを期待T-SQLの予期しない動作
IF isnull(0,'') = ''
select 'true'
else
select 'false'
が、SQL Serverは、なぜ、「真」と言われますか?
ISNULLは2つの値(NULLと0)がある場合は同じですので、IF条件でtrueになり、 'true'を選択すると印刷されます。
この場合、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を明示的にチェックする方が良いでしょう。
ok、説明のためにthx。私は "select cast( '' int)"を返し、0を返します – star
@Starなぜあなたはこれをやっていますか?この「IF ISNULL」構造によって解決したい実際の問題は何ですか?おそらく、それを行うためのより簡単で速い方法があります –
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'
を返します(0、 '')は整数0を返し、2番目のオペランドを整数としてもチェックすると、select cast( ''は整数)、i tも0を返します。異なるタイプは使用しないでください。これは、この種の変換の問題で終了します。 –
なぜこのような 'ISNULL()'を使うのですか?このようなコードを 'WHERE'または' SELECT'文で使用すると、ヌル値を何かに変換すると、テーブル全体が強制的にスキャンされます。これを 'SELECT'ステートメントで使用することはできません –
@MarcGuillotしかし[this](https://connect.microsoft.com/SQLServer/feedbackdetail/view/347996/converting-an-empty-string-0-int)を読んでください。 -does-not-honor-round-trip-conversion-undocumented)。空の文字列を数値にキャストするとエラーが発生することを示します。 –