我想我并不完全理解SQL中NULL的含义。我跑了这个SQL,我期望看到1作为输出,但我没有看到:“select 1 where NULL <> -1”的输出;“
select 1 where NULL <> -1;
是不是NULL和-1不同?任何人都可以解释为什么“NULL <> -1”这个子句是否为假?
我想我并不完全理解SQL中NULL的含义。我跑了这个SQL,我期望看到1作为输出,但我没有看到:“select 1 where NULL <> -1”的输出;“
select 1 where NULL <> -1;
是不是NULL和-1不同?任何人都可以解释为什么“NULL <> -1”这个子句是否为假?
NULL
意味着未知。所以用where NULL <> -1
你想知道未知值是否等于-1。 DBMS不知道(当然),所以表达式的结果既不是TRUE
也不是FALSE
;它是NULL
。
仅选择WHERE
子句导致TRUE
的行。由于您的表达式不会导致TRUE
,而是导致NULL
,因此不会选择任何行。
事实上,与NULL比较的结果会导致UNKNOWN,而不是NULL。 – dnoeth
@dnoeth:不,NULL *是未知的数据库名称。尝试'select 1 where(null = -1)is null'。 (这里是对PostgreSQL的测试:http://sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/11585。) –
列可以是NULL,但从来没有比较的结果,这就是为什么有'IS UNKNOWN'标准SQL(也是PostgreSQL)。请参阅https://books.google.de/books?id=efe2wB_DfxYC&pg=PA219&lpg=PA219&dq=%22Truth+table+for+the+AND+boolean+operator%22&source=bl&ots=DfT9W4xLGF&sig=Yee-tSw5oQjTfoazWtRYEzuXBMM&hl=de&sa = X&ved = 0ahUKEwjQ6ICmrpfPAhWBpiwKHVNQBo0Q6AEIJTAB#v = onepage&q =%22Truth%20table%20for%20the%20AND%20boolean%20operator%22&f = false – dnoeth
基本上,除IS NULL以外的所有比较都返回“false”或“NULL”。也就是说,它们从来都不是真的,行被过滤掉了。 –
NULL不是一个值,因此无法进行比较。 – Joe
这就是为什么我们声明'something IS NULL'而不是'something = NULL' –