今天我了解到这SELECT f1,EXISTS(SELECT ...),f2
在 MySQL 中是有效的,并且从 StackOverflow 读取,显然在 PostgreSQL 中也是有效的,EXISTS
当子查询结果为空时该部分为 0,当结果为空时该部分为 1。然后我开始思考并测试了一些看起来像的查询SELECT * WHERE column1 - column2
,甚至这也有效并且与column1 <> column2
. 我什至尝试过WHERE (column1 > 0) - column2
,甚至这也奏效了。这个 SQL 标准或只是 MySQL 是否愿意随意转换布尔值和整数?或者布尔值甚至不存在于 SQL 中,而 0 / 1 代表它们?
boolean
do存在于 SQL 标准中,但作为“真实的”布尔值存在。所以有效的布尔文字是
false
ortrue
。MySQL 实际上并不支持
boolean
值。它只是将无法转换为非零数字的任何内容视为“假”。例如
被接受为有效(即使它是无效的 SQL)并且等效于
where false
因为xxxx
无法转换为数字因此被假定为被0
视为false
.另一方面
被视为
where true
因为42xxx
将(隐含地)转换为42
which 又被视为“true”。查询:
是无效的标准 SQL,因为它产生一个数字(假设 column1 和 column2 是数字)并且数字不是布尔表达式。
您可以在执行以下操作时看到此行为:
MySQL 返回数字
1
,而支持真实布尔值的数据库(例如 Postgres)将返回true
. Oracle 不支持真正的布尔值,因此select 1 > 0 from dual
在那里实际上是无效的。