- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么以下两个都返回零?第二个肯定是第一个的否定吗?我使用的是 SQL Server 2008。
DECLARE
@a VARCHAR(10) = NULL ,
@b VARCHAR(10) = 'a'
SELECT
CASE WHEN ( ( @a IS NULL
AND @b IS NULL
)
OR @a = @b
) THEN 1
ELSE 0
END , -- Returns 0
CASE WHEN NOT ( ( @a IS NULL
AND @b IS NULL
)
OR @a = @b
) THEN 1
ELSE 0
END -- Also returns 0
最佳答案
这是一个否定。但是,您需要了解 ANSI NULL - NULL 的否定也是 NULL。 NULL 是一个虚假的真值。
因此,如果您的任何参数为 null,则 @a = @b
的结果将为 null(假),并且其否定也将为 null(假)。
要按照您想要的方式使用否定,您需要摆脱 NULL。但是,简单地反转比较结果可能会更容易:
case when (...) then 1 else 0 end,
case when (...) then 0 else 1 end
这将始终为您提供 1, 0
或 0, 1
。
编辑:
正如 jpmc26 所指出的,稍微扩展一下 null 的行为方式可能会很有用,这样您就不会认为单个 NULL
就会导致一切 NULL
。有些运算符在参数之一为 null 时并不总是返回 null
- 最明显的例子当然是 is null
。
在更广泛的示例中,T-SQL 中的逻辑运算符使用 Kleene 代数(或类似的代数),它定义 OR
表达式的真值,如下所示:
| T | U | F
T | T | T | T
U | T | U | U
F | T | U | F
(AND
是类似的,其他运算符也是如此)
因此您可以看到,如果至少一个参数为 true,则结果也将为 true,即使另一个参数未知(“null”)。这也意味着 not(T or U)
会给你一个虚假的真值,而 not(F or U)
也会给你假真值,尽管 F 或 U
是假的 - 因为 F 或 U
是 U
,而 not(U)
也是 U
,这是假的。
这对于解释为什么当两个参数都为 null 时表达式按照您期望的方式工作非常重要 - @a is null 和 @b is null
计算结果为 true,并且 true或未知
计算结果为true
。
关于sql-server - "NOT"什么时候不是否定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39471241/
我是一名优秀的程序员,十分优秀!