@FlorianHeer是对的。 NULL> 0将最终评估为false,但是@Pred指出这是因为Null> 0实际上评估为null,而null强制转换为一个比特为假......
null是未知的,因此与这也是未知的。考虑算术函数,如加法1 + NULL = NULL
或连接'A' + NULLL = NULL
。 NULL意味着SQL数据库引擎无法解释它的值是什么,所以任何函数或比较都是未知的。
@MikkaRin指出,它是在case语句或IF语句的ELSE部分中的假设,可能会出现问题,但我们也可以在连接的上下文中思考这个问题,以及您可能希望如何看结果。
DECLARE @Table1 AS TABLE (Col INT)
DECLARE @Table2 AS TABLE (Col INT)
INSERT INTO @Table1 VALUES (1),(2),(3)
INSERT INTO @Table2 VALUES (1),(NULL),(3),(4)
SELECT *
FROM
@Table1 t1
INNER JOIN @Table2 t2
ON t1.Col <> t2.Col
当然,您可能会认为,因为NULL不等于1,2,3应该包含在结果集中。但是null是未知的,所以SQL说的很好,我不知道NULL是否可以是1,2,3,所以我不能返回结果。
现在让我们做同样的事情,但在第一个表添加一个NULL:
DECLARE @Table1 AS TABLE (Col INT)
DECLARE @Table2 AS TABLE (Col INT)
INSERT INTO @Table1 VALUES (1),(2),(3),(NULL)
INSERT INTO @Table2 VALUES (1),(NULL),(3),(4)
SELECT *
FROM
@Table1 t1
INNER JOIN @Table2 t2
ON t1.Col = t2.Col
同样的,你可能会认为NULL是=为NULL,但空的任何比较被认为是不明所以,即使两个表具有在它的NULL它不会在数据集中返回。
现在考虑:
DECLARE @Table1 AS TABLE (Col INT)
INSERT INTO @Table1 VALUES (1),(2),(3),(NULL)
SELECT *, CASE WHEN Col < 2 THEN Col ELSE 1000 END as ColCase
FROM
@Table1 t1
这将使得即便是NULL 1000问题是应该NULL未知的是1000?如果NULL是未知的,我们怎么知道它不小于2?
对于您的大量操作,可能只需比较@Value > 1
即可,但特别是当您在IF语句的情况下开始处理ELSE或加入对立时,应考虑处理NULL。如@GuidoG使用ISNULL()
或COALESCE()
指出。
恕我直言明确表示您在操作期间的意图,以适当考虑空值,权衡最小的打字节省。
测试不是多余的。如果Test为空,那么IF测试的结果> 0会怎样? – GuidoG
'IF @test> 0'就足够了,除非你没有其他的行为,如果@test为null – Fabio
我建议试试像'select case when null> 5或null <= 5 then 1 else 0 end '并且如果你用NOT取代整个条件会发生什么 - SQL有'true/false'的3个状态,然后是null - 在我看来,你不希望将NULL送入它,除非你准备永远非常在意如何处理NULL – Cato