VARCHAR和CHAR之间的SQL Server Null比较

时间:2016-05-13 17:50:53

标签: sql-server

问题:

  • 我有一个包含2列的表,一个char(1)和另一个varchar(1)。
  • 我在NULLS
  • 中插入一行
  • 我比较了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'
             ELSE 'no'
        END AS eq2
FROM    ss_1 AS S

FIDDLE:

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

2 个答案:

答案 0 :(得分:2)

实际上这是因为SQL基于三值逻辑,其中谓词可以被评估为3个不同的值:TRUEFALSEUNKNOWN。当比较的任何部分为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