2016-04-27 6 views
3

これは非常に基本的な質問かもしれませんが、私はちょうど質問を書いている間にやってきました。IS NULLをBITに変換する

NULLのチェックをSQL ServerがBITに変換できないのはなぜですか?私はこのような何かを考えていた:

DECLARE @someVariable INT = NULL; 
-- Do something 
SELECT CONVERT(BIT, (@someVariable IS NULL)) 

期待される結果が、その後1または0のどちらかだろう。

+0

それはできたが、それはそうではありません。たとえば、MySQLは可能でした;-) –

+0

@ÁlvaroGonzálezMySQLには、標準以外のステートメントの**ロット**が含まれていますし、ブレークのSQLのロジックもあります。 'IS' *は条件式の外では使用できません。それは比較演算子ではありません。 NULL値のロジックでは、NULL *との比較は* nullです。'IS NULL'と' IS NOT NULL'は使用できる唯一の*条件付き演算子です –

+0

@PanagiotisKanavos 'foo = NULL'は' foo IS NULL'とは違うと理解しています。しかし、MySQLの実装が何か問題を起こしている特定のシナリオがありますか?結局のところ、 'WHERE deletion_date IS NULL'を使うと、最終的にブール値で非nullの決定が得られます。 –

答えて

0

言語、NULLがない考えられたデータ値です。彼らは不明/未知の状態を表します。 Wikipedia's article on SQL NULLからの引用:

SQL NULLは状態(不明)であり、値ではありません。この使用法は、ほとんどのプログラミング言語とはかなり異なります。ここで、nullは特定のインスタンスに割り当てられていないことを意味します。

これはUNKNOWN値に対して任意比較のみUNKNOWN自体であってもよいことを意味します。 2つのNULLを比較してもtrueを返すことはできません。両方の値がが不明である場合は、が等しいかどうかをどのようにすればよいでしょうか?

IS NULLおよびIS NOT NULLは、条件式に使用できる述語です。つまり、彼ら自身が価値を返さないということです。したがって、それらはビットに「キャスト」することも、ブールとして扱うこともできません。

Nullと何かを比較すると、基本SQL比較演算子は常にUnknownを返します。したがって、SQL標準では2つの特別なNull固有比較述部が用意されています。 IS NULLおよびIS NOT NULL述部(後置式構文を使用する)は、データがNullであるか否かをテストします。

nullを処理する他の方法は、ベンダー固有の拡張です。

最後に、BITではありません。ブール型です。単なる1ビットの数値です。オプションのBOOLEANタイプがSQL 1999に導入されましたが、PostgreSQLだけが正しく実装されています。すなわち、TRUE,FALSEまたはUNKNOWNの値を持っています。

またはx IS NULLのような条件式の結果を実際に計算することはできません。BOOLEANタイプがない場合は、 NULLIFまたはCOALESCEのような関数を使用して、NULL値を別のものに置き換えることができます。

+0

良い説明。フォローアップの質問を追加できますか?元の質問が 'SELECT CONVERT(BIT、(@ someVariable = 123))'(つまり、NULLは関係ありません)に関するものでしたか? –

+0

@ÁlvaroGonzálezno 1)は無効な構文です2)これはキャスト内の*割り当て*または試行された比較ですか? 3)これは、CASTの有効な表現と、標準とベンダーの実装間の違い、そして最後に比較がSQLで値を返すことができるかどうかについての長い答えとは別の質問であるべきです。 –

+0

私は疑問を間違いなく誤解しましたなぜなら、私はいつもそれが構文に関するものだと思っていたからです。決して心配しないでください...そしてすばらしい答えに感謝します。 –

8

使用case:SQLで

SELECT CONVERT(BIT, (CASE WHEN @someVariable IS NULL THEN 1 ELSE 0 END)) 
+0

これは 'CASE'を使って実現できます。しかし、私はなぜ* @ * SQLサーバが '@someVariable IS NULL'をどう扱うべきかを知りませんでした。 –

+0

@diiN_私たちは皆、あなたがそれをやる方法を求めていると思っていたと思います。プログラムは、コード化されていないことを行うのに十分スマートではありません。 –

+0

@ÁlvaroGonzález希望する結果を得る方法はたくさんあります。私はちょうど私がしようとしていたようにそれを使用することができない理由を理解していませんでした。 –

1

ない直接キャスト

select cast(isnull(@null,1) as bit)