2012-03-22 263 views
14

在SQL的维基百科页面上,有一些关于SQL中布尔逻辑的真值表。 [1]维基百科页面似乎来源于SQL:2003标准。标准SQL布尔运算符IS与等于(=)运算符

等号运算符(=)的真值表与SQL:2003草案中的IS运算符不同。

此外,维基百科文章指出“IS NULL”(<空谓词>)是一种特殊情况。

在SQL:2003中似乎有一个“IS”操作符,它是一个像AND,NOT和OR这样的常规操作符。但是,<空谓词>仍然存在。

为什么<空谓词那里当IS是一个常规的布尔运算符?是否要确保可以使用“IS NULL”构造和非布尔值而没有类型转换?不鼓励使用“= NULL”?

SQL:2011标准的工作方式是否有所不同?

[1]:Wikipedia on SQL

[2]:SQL:2011 draft PDF页面335

[3]:SQL:2003 draft PDF页面397

+4

没什么等于空,甚至不为NULL。所以'NULL = NULL','NULL = 1'和'1 = NULL'都是假的(实际上它们都是'NULL' /'Unknown',它是*不真实的*,所以真的很接近假)。但是'NULL IS NULL'是真的。 – MatBailie 2012-03-22 12:30:05

+0

我还没有读过你的链接。 'SQLite'有一个'IS'运算符,它可以与'='互换,除了它具有'NULL = NULL'的语义。 – 2012-03-22 14:01:20

+0

我们应该在第335页看到什么?当然你有正确的页码?这是关于'' – 2012-03-22 14:07:13

回答

10

对我来说这是一个新的。

如果我没看错的<boolean value expression>语法定义了三个谓词仅仅是为了与boolean数据类型IS TRUEIS FALSEIS UNKNOWN使用。

这些不同于他们的平等同行,他们只评估为TrueFalse。从来没有Unknown。即UNKNOWN = TRUE将评估为UNKNOWN,但UNKNOWN IS TRUE评估为False

IS=的完整真值表如下。

+---------+-------+-------+---------+ 
| IS | TRUE | FALSE | UNKNOWN | 
+---------+-------+-------+---------+ 
| TRUE | TRUE | FALSE | FALSE | 
| FALSE | FALSE | TRUE | FALSE | 
| UNKNOWN | FALSE | FALSE | TRUE | 
+---------+-------+-------+---------+ 

与之相对

+---------+---------+---------+---------+ 
| = | TRUE | FALSE | UNKNOWN | 
+---------+---------+---------+---------+ 
| TRUE | TRUE | FALSE | UNKNOWN | 
| FALSE | FALSE | TRUE | UNKNOWN | 
| UNKNOWN | UNKNOWN | UNKNOWN | UNKNOWN | 
+---------+---------+---------+---------+ 
+0

请注意,操作符为'IS TRUE','FALSE','IS NULL'和'IS UNKNOWN'。他们是一元操作员,根据RHS条件评估LHS表达。 IS表必须被看作'顶部的操作符,侧面的操作数'; UNKNOWN IS UNKNOWN的计算结果为TRUE。同时要注意,LHS可以是'行类型'(可能不是正确的技术术语),然后评估会遍历LHS中的每个项目。此外,运算符可以被否定为“不为空”,“不是真”,“不是错”,“不是未知”。这可能会导致严重的头痛。 (续) – 2012-03-22 17:07:11

+0

(续):IIRC,有一行'行不为空'和'NOT(行IS NULL)'不一定是相同的答案。我认为不同之处在于,如果某列不为空,'NOT(row IS NULL)'计算结果为真,但'行不为空'只有在所有列不为空时才计算为真。对于“行”中的单个值,这些值是相同的;对于多个值,它们不一定相同。 – 2012-03-22 17:12:31

+0

@JonathanLeffler标准(2003和2011)使用术语“IS布尔运算符”。如果他们是独立的一元运营商,他们会不会使用复数?请参见打印页码281上的6.34节<布尔值表达式>。 – 2012-03-23 00:57:06

0

作为上述海报说,null = null是不正确的。它将返回NULL(false)

对于空比较,您必须使用IS NULLIS NOT NULL

+0

***它会返回NULL(false)***不是一个有效的语句。 'NULL!== FALSE','NULL!== TRUE','NULL!== NULL'。它只是* undefined *。 – Fr0zenFyr 2017-10-07 12:27:48