布尔值之间的SQL比较可能导致意外结果
P粉982009874
P粉982009874 2023-08-18 16:25:41
[MySQL讨论组]

为什么大多数(全部?)SQL数据库会给出以下结果:

SELECT FALSE < FALSE;      -- FALSE / 0   Ok
SELECT TRUE < FALSE;       -- FALSE / 0   Ok

SELECT NOT(FALSE) < FALSE; -- TRUE / 1    什么?
SELECT NOT(TRUE) < FALSE;  -- TRUE / 1    什么??

只是再次确认一下:

SELECT NOT(TRUE) = FALSE;  -- TRUE / 1    Ok
SELECT NOT(FALSE) = TRUE;  -- TRUE / 1    Ok

在Postgres中,我也可以检查:

SELECT pg_typeof(TRUE), pg_typeof(NOT(FALSE));
  -- boolean | boolean

我已经尝试过PostgreSQL、SQLite3和MariaDB,它们都得出了相同的意外结果。

我漏掉了什么?

P粉982009874
P粉982009874

全部回复(1)
P粉513316221

我不确定 NOT(FALSE) 是如何评估的,但 NOT 不是一个函数。如果你想要对一个布尔字面量取非,那么括号应该放在整个表达式的周围,即使用 (NOT FALSE) 而不是 NOT(FALSE)。考虑以下示例:

SELECT (NOT FALSE) < FALSE; -- 0,与 TRUE < FALSE 相同
SELECT (NOT TRUE) < FALSE; -- 0,与 FALSE < FALSE 相同
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号