gpt4 book ai didi

sql-server - "NOT"什么时候不是否定?

转载 作者:行者123 更新时间:2023-12-01 18:10:22 24 4
gpt4 key购买 nike

为什么以下两个都返回零?第二个肯定是第一个的否定吗?我使用的是 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, 00, 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 或 UU,而 not(U) 也是 U,这是假的。

这对于解释为什么当两个参数都为 null 时表达式按照您期望的方式工作非常重要 - @a is null 和 @b is null 计算结果为 true,并且 true或未知 计算结果为true

关于sql-server - "NOT"什么时候不是否定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39471241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com