是";其中“foo”;及;“如果foo是真的”;在PostgreSQL中是否等效?

是";其中“foo”;及;“如果foo是真的”;在PostgreSQL中是否等效?,postgresql,Postgresql,我从这些数据中得到了相同的计数: SELECT COUNT(*) FROM "users" WHERE admin SELECT COUNT(*) FROM "users" WHERE admin IS TRUE 它们是等价的,还是有细微的差别 可能是为了实现跨引擎兼容性,这是一个首选吗?它们是绝对等效的 没有技术上的理由选择其中一个。我个人更喜欢第一个,它比较短,而我发现大多数其他人更喜欢admin=TRUE的它们完全相同 没有技术上的理由选择其中一个

我从这些数据中得到了相同的计数:

SELECT COUNT(*) FROM "users" WHERE admin
SELECT COUNT(*) FROM "users" WHERE admin IS TRUE
它们是等价的,还是有细微的差别


可能是为了实现跨引擎兼容性,这是一个首选吗?

它们是绝对等效的


没有技术上的理由选择其中一个。我个人更喜欢第一个,它比较短,而我发现大多数其他人更喜欢admin=TRUE的

它们完全相同


没有技术上的理由选择其中一个。我个人更喜欢短一点的第一个,而我发现大多数其他人更喜欢
其中admin=TRUE

在处理空值方面有细微的区别:

简而言之,
IS
语法总是返回布尔值,而不是传播空值。这在
WHERE
子句中不会有什么区别,因为
NULL
条件不包括行,但这是一个重要的区别

除此之外,主要的优点是明确的:在复杂的SQL查询中,特定列是否为布尔值可能并不明显,因此添加
is TRUE
可以使意图更加清晰


来自没有布尔类型的系统的用户可能也会本能地使用
其中admin=TRUE
(这会在产生差异的上下文中传播
NULL
s)。这些代码实际上无法移植到此类系统,因为它们无法识别“true”关键字。

在处理空值方面存在细微差异:

简而言之,
IS
语法总是返回布尔值,而不是传播空值。这在
WHERE
子句中不会有什么区别,因为
NULL
条件不包括行,但这是一个重要的区别

除此之外,主要的优点是明确的:在复杂的SQL查询中,特定列是否为布尔值可能并不明显,因此添加
is TRUE
可以使意图更加清晰


来自没有布尔类型的系统的用户可能也会本能地使用
其中admin=TRUE
(这会在产生差异的上下文中传播
NULL
s)。这些代码实际上无法移植到此类系统中,因为它们无法识别“true”关键字。

非常彻底–谢谢!非常彻底-谢谢!
SELECT null::boolean -- null
SELECT null::boolean IS TRUE -- boolean false
SELECT null::boolean IS NOT TRUE -- boolean true