2016-09-17 52 views
0

我想我并不完全理解SQL中NULL的含义。我跑了这个SQL,我期望看到1作为输出,但我没有看到:“select 1 where NULL <> -1”的输出;“

select 1 where NULL <> -1; 

是不是NULL和-1不同?任何人都可以解释为什么“NULL <> -1”这个子句是否为假?

+2

基本上,除IS NULL以外的所有比较都返回“false”或“NULL”。也就是说,它们从来都不是真的,行被过滤掉了。 –

+1

NULL不是一个值,因此无法进行比较。 – Joe

+1

这就是为什么我们声明'something IS NULL'而不是'something = NULL' –

回答

0

NULL不是一个值,因此不能与任何其他值进行比较并获得除null之外的其他结果。 Docs。和how来比较空值。

+0

我不知道OP使用的是什么RDBMS,但我不认为它是Oracle。 Oracle不应该接受OP的语法IIRC,它需要'from'。 – hvd

+0

@hvd:关于如何处理表达式中的NULL值的解释仍然适用于任何SQL方言 –

+0

@a_horse_with_no_name通常是的,但链接文档也包含Oracle特定的详细信息,至少有关零长度字符串的警告和提到一些非标准功能。这对OP没有用处。 – hvd

0

NULL意味着未知。所以用where NULL <> -1你想知道未知值是否等于-1。 DBMS不知道(当然),所以表达式的结果既不是TRUE也不是FALSE;它是NULL

仅选择WHERE子句导致TRUE的行。由于您的表达式不会导致TRUE,而是导致NULL,因此不会选择任何行。

+0

事实上,与NULL比较的结果会导致UNKNOWN,而不是NULL。 – dnoeth

+0

@dnoeth:不,NULL *是未知的数据库名称。尝试'select 1 where(null = -1)is null'。 (这里是对PostgreSQL的测试:http://sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/11585。) –

+0

列可以是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

相关问题