Sql 所以看起来结果是假的,但绝对不是假的。@Adam Robinson:我只是想澄清一下,虽然它从来都不是真的,但也从来都不是假的。比较结果为null(技术上为“未知”)。它不是错误的,因为如果它是,你可以否定它,并得到真实的,而你不能。永远不会执行分支(或行

Sql 所以看起来结果是假的,但绝对不是假的。@Adam Robinson:我只是想澄清一下,虽然它从来都不是真的,但也从来都不是假的。比较结果为null(技术上为“未知”)。它不是错误的,因为如果它是,你可以否定它,并得到真实的,而你不能。永远不会执行分支(或行,sql,database,null,nullable,Sql,Database,Null,Nullable,所以看起来结果是假的,但绝对不是假的。@Adam Robinson:我只是想澄清一下,虽然它从来都不是真的,但也从来都不是假的。比较结果为null(技术上为“未知”)。它不是错误的,因为如果它是,你可以否定它,并得到真实的,而你不能。永远不会执行分支(或行永远不匹配),因为这些分支依赖于true的值。很好的视角!另一种看待它的方式是,如果“未知a”等于“未知b”,那么它们不可能真的那么未知,因为你对它们有所了解。有点像量子力学。@womp:事实上,你知道你不知道;)简而言之,anything=N


所以看起来结果是假的,但绝对不是假的。@Adam Robinson:我只是想澄清一下,虽然它从来都不是真的,但也从来都不是假的。比较结果为null(技术上为“未知”)。它不是错误的,因为如果它是,你可以否定它,并得到真实的,而你不能。永远不会执行分支(或行永远不匹配),因为这些分支依赖于true的值。很好的视角!另一种看待它的方式是,如果“未知a”等于“未知b”,那么它们不可能真的那么未知,因为你对它们有所了解。有点像量子力学。@womp:事实上,你知道你不知道;)简而言之,
anything=NULL
为NULL(既不为真也不为假)。而且
任何空的东西
也都是空的。嘿,读了你的解释后,我得到了一个“我脑子里的编译错误”。我的意思是,为什么二进制比较被允许呢?如果我从A.xxx null中写入
选择*,我会得到一个空结果集。但是,如果我从where null中写入
select*,这是一个语法错误。“value null=>null”的解释对我来说有点不太合适……你能帮我怎么看待这个问题吗?也许,像
value null=>false
value=null=>false
这样思考会更有意义?这将避免我所说的类型错误。此外,像这样,我们可以推断像
value null和1=1
这样的东西的含义是什么,而
null和1=1
在语法上又是奇怪的。。。正如我所说的,我只是想把我的头绕到这一点上。
foo OP NULL
是允许的,因为SQL被破坏了。整个答案是关于这一点毫无意义,并且与标准和实际语义相矛盾。关于这一点的另一个观点,请回答以下问题:“我手中的东西是一个苹果”。对还是错?你能给出的唯一答案是未知的。现在回答:“我手里有一件东西。”。再说一次,你不知道。“那”毫无意义,当然是认为
foo!=NULL
foo=NULL
为假。他们不知道。
where ((A=B) OR (A IS NULL AND B IS NULL))
WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))
where (A<>B)
where (A<>B)
WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))
SET ANSI_NULLS OFF

select result =
    case
        when  null=null then 'eq' 
        else 'ne'
    end

SET ANSI_NULLS ON

select result =
    case
        when  null=null then 'eq' 
        else 'ne'
    end