2016-05-13 6 views
0

問題:VARCHARとCHARとの間にSQL Serverのヌルの比較

  • 私は2列を持つテーブルを持って、1つの文字(1)と、別のvarchar(1)。
  • は、私は彼らが等しくないことを得る私は2列は
  • 値比較NULLS
  • と行を挿入
  • なぜ?

コード:

CREATE TABLE ss_1 
    (
     [char] CHAR(1) , 
     [varchar] VARCHAR(3) 
    ) 



INSERT INTO TimeCurrent..ss_1 
     (char, varchar) 
VALUES (NULL,-- char - char(1) 
      NULL -- varchar - varchar(3) 
     ) 

SELECT CASE WHEN S.char = S.varchar THEN 'yes' 
      ELSE 'no' 
     END AS eq2 
FROM ss_1 AS S 

FIDDLE:そのような

http://sqlfiddle.com/#!6/84bc4/2/0

+4

NULL!= NULLこれを参照してください:http://stackoverflow.com/questions/1843451/why-does-null-null-evaluate-to-false-in-sql-server – n8wrl

+1

これは2つのINTと彼らも同じではありません。 UNKNOWN = UNKNOWNは未知であるため、等しくない結果となります。 –

+1

@juergend、これは不明のためではありません=不明な点は等しくありません。 –

答えて

1

実はこれがあるためである:これは実際にはわずかに良い、とあなたの実際の意図をより反映かもしれませんSQLは、3つの異なる値に基づいて述語を評価できる3つの値の論理に基づいています。TRUE,FALSEおよびUNKNOWNである。比較の一部がNULLの場合、述部はUNKNOWNと評価されます。これは正式な定義です。例:今、あなたが書くとき

1 = 1 => TRUE 
1 = 2 => FALSE 
1 = NULL => UNKNOWN 
NULL = NULL => UNKNOWN 

CASE WHEN predicate THEN 

それは、述語がTRUEと評価された場合にのみTHENに行きます。しかしあなたの場合、それはUNKNOWNと評価されます。それはなぜELSE部分に行くのですか?

+0

ありがとう。私はポストする前にもう少しグーグルですべきだった。 –

1
CREATE TABLE ss_1 
(
    [char] CHAR(1) , 
    [varchar] VARCHAR(3) 
) 



INSERT INTO TimeCurrent..ss_1 
    (char, varchar) 
VALUES (NULL,-- char - char(1) 
     NULL -- varchar - varchar(3) 
    ) 

SELECT CASE WHEN coalesce(S.char, '') = coalesce(S.varchar, '') THEN 'yes' 
     ELSE 'no' 
    END AS eq2 
FROM ss_1 AS S 

何かがあなたが後にしている何のために働くかもしれません。前述したように、nullと別のnullの値を直接比較すると、nullは単に値がないことを意味するため、比較する値はありません。入力データ型はこれに関係しません(両方がchar(1)またはchar (3)の場合、またはそれ以外のデータ型の場合も同じです)。

編集:ブランクがその列のデータベースで有効な入力である場合、''を他の(そうでなければ有効ではない)値に置き換えることを忘れないでください。または大丈夫であってもなくてもよいNULL値に対するデータベース...

EDIT 2:

CREATE TABLE ss_1 
(
    [char] CHAR(1) , 
    [varchar] VARCHAR(3) 
) 



INSERT INTO TimeCurrent..ss_1 
    (char, varchar) 
VALUES (NULL,-- char - char(1) 
     NULL -- varchar - varchar(3) 
    ) 

SELECT CASE WHEN S.char = S.varchar THEN 'yes' 
     CASE When S.char IS NULL and S.varchar IS NULL Then 'yes' 

     ELSE 'no' 
    END AS eq2 
FROM ss_1 AS S 
+0

ありがとう、私は自分のためにテストしていた、私はisnull(col、 '')両側を使って周りを得た。しかし、他のポスターと同様に、SQL NULLは不明で、Javascriptと違って –

関連する問題