优化NULL/NOT NULL标志PostgreSQL查询

Pau*_*aul 2 postgresql

我试图得到一个包含布尔标志的记录:如果特定结果集中的列至少有一个NOT NULL值,则为true;如果所有值都为NULL,则为false.

结果集的示例数据

SELECT "my column 1", "my column 2", "my column 3", "my column 4", "my column 5" 
FROM my_data 
WHERE date BETWEEN :start AND :end

"my column 1" "my column 2" "my column 3" "my column 4" "my column 5"
   NULL          NULL          25.2          NULL          1.12
   15.28         NULL          NULL          NULL          2.25
   NULL          NULL          13.9          NULL          3.03
   359.00        NULL          125.5         NULL          4.15
   NULL          NULL          152.2         NULL          5.99
   NULL          NULL          NULL          NULL          6.35
Run Code Online (Sandbox Code Playgroud)

在这种情况下,结果应该是:

"my column 1" "my column 2" "my column 3" "my column 4" "my column 5"
   t             f             t             f             t
Run Code Online (Sandbox Code Playgroud)

以下PostgreSQL查询完全符合我的需要(实际上,只要检测到第一个NOT NULL值,它就会终止每个子查询),但是可以对其进行优化吗?:

WITH x AS (SELECT * FROM my_data WHERE date BETWEEN :start AND :end)

SELECT
    EXISTS(SELECT * FROM x WHERE "my column 1" IS NOT NULL) AS "my column 1",
    EXISTS(SELECT * FROM x WHERE "my column 2" IS NOT NULL) AS "my column 2",
    EXISTS(SELECT * FROM x WHERE "my column 3" IS NOT NULL) AS "my column 3",
    EXISTS(SELECT * FROM x WHERE "my column 4" IS NOT NULL) AS "my column 4",
    EXISTS(SELECT * FROM x WHERE "my column 5" IS NOT NULL) AS "my column 5"
Run Code Online (Sandbox Code Playgroud)

我认为它可以写得更短或更普遍,而不提每个列名.

a_h*_*ame 7

另一种方法是使用bool_or()聚合,如果至少有一个值为真,则返回true.

SELECT bool_or("my column 1" is not null) AS "my column 1",
       bool_or("my column 2" is not null) AS "my column 2",
       bool_or("my column 3" is not null) AS "my column 3",
       bool_or("my column 4" is not null) AS "my column 4",
       bool_or("my column 5" is not null) AS "my column 5"
FROM my_data
WHERE date BETWEEN :start AND :end;
Run Code Online (Sandbox Code Playgroud)

还有的bool_and()都将返回true只有当所有的值都是真正的集合.