PostgreSQL bool_and() 函数使用指南
PostgreSQL bool_and()
函数是一个聚合函数,它返回一个分组中的所有指定的非 null 的布尔值"逻辑与"运算后的结果。也就是,如果所有非 null 的输入值都是真,此函数返回真,否则返回假。
bool_and()
语法
这里是 PostgreSQL bool_and()
的语法:
bool_and(expr) -> bool
我们通常在 SQLite 中按如下方式使用 bool_and()
函数:
SELECT bool_and(expr), ...
FROM table_name
[WHERE ...]
[GROUP BY group_expr1, group_expr2, ...];
参数
expr
- 必需的。一个列名或者表达式。
返回值
PostgreSQL bool_and()
函数返回一个布尔值。如果所有非 null 输入值都是真,此函数返回真,否则返回假。
注意,bool_and()
函数只处理那些非 null 的值。也就是说, null 值会被 bool_and()
函数忽略。
bool_and()
示例
为了演示 PostgreSQL bool_and()
的用法,我们使用以下 UNION
和 SELECT
语句模拟一个表:
SELECT 'Tim' name, 'Football' club, true joined
UNION
SELECT 'Tim' name, 'Baseball' club, true joined
UNION
SELECT 'Tom' name, 'Football' club, true joined
UNION
SELECT 'Tom' name, 'Baseball' club, null joined
UNION
SELECT 'Jim' name, 'Football' club, true joined
UNION
SELECT 'Jim' name, 'Baseball' club, false joined;
name | club | joined
------+----------+--------
Tim | Football | t
Tim | Baseball | t
Tom | Football | t
Tom | Baseball | <null>
Jim | Football | t
Jim | Baseball | f
(6 rows)
这里,我们拥有了关于用户是否加入俱乐部的一些行。其中 name
列中是用户的名称, club
列中是俱乐部的名称, joined
列中是表示是否加入了俱乐部的布尔值。
假如,要确定一个用户是否加入了全部的俱乐部,您可以使用 GROUP BY
子句按照 name
分组,并使用 bool_and()
函数对 joined
列的值进行运算。下面的语句实现了这个需求:
SELECT
t.name,
bool_and(t.joined) joined_all
FROM
(
SELECT 'Tim' name, 'Football' club, true joined
UNION
SELECT 'Tim' name, 'Baseball' club, true joined
UNION
SELECT 'Tom' name, 'Football' club, true joined
UNION
SELECT 'Tom' name, 'Baseball' club, null joined
UNION
SELECT 'Jim' name, 'Football' club, true joined
UNION
SELECT 'Jim' name, 'Baseball' club, false joined
) t
GROUP BY t.name;
name | joined_all
------+------------
Tom | t
Tim | t
Jim | f
(3 rows)
这里,
- 对于 Tim,他的两行的
joined
列有两个true
,因此bool_and(t.joined)
返回了true
。 - 对于 Tom,他的
joined
列有一个true
和一个null
,但是 由于bool_and(t.joined)
只处理非 null 的输入值,因此bool_and()
返回了true
。 - 对于 Jim,他的
joined
列有一个true
和一个false
,因此bool_and(t.joined)
返回了false
。