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() 的用法,我们使用以下 UNIONSELECT 语句模拟一个表:

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