问题:
代码:
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:
答案 0 :(得分:2)
实际上这是因为SQL
基于三值逻辑,其中谓词可以被评估为3个不同的值:TRUE
,FALSE
和UNKNOWN
。当比较的任何部分为NULL
时,谓词的评估结果为UNKNOWN
。这是正式的定义。例如:
1 = 1 => TRUE
1 = 2 => FALSE
1 = NULL => UNKNOWN
NULL = NULL => UNKNOWN
现在你写的时候:
CASE WHEN predicate THEN
仅当谓词评估为THEN
时,它才会转到TRUE
。但在你的情况下,它评估为UNKNOWN
。这就是为什么它会转到ELSE
部分。
答案 1 :(得分: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)
,或者其他一些数据类型,这将是相同的。)
编辑:有一点需要注意,如果空白是数据库中该列的有效输入,那么您希望将''
替换为其他(否则不合法)值,否则您需要&#39 ; ll最终将数据库中的空白值与空值匹配,这可能是也可能不是......
编辑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