查找列的 MIN / MAX,当同一张表中的其他列 DO / DONT 有 NULL
Posted
技术标签:
【中文标题】查找列的 MIN / MAX,当同一张表中的其他列 DO / DONT 有 NULL【英文标题】:Find MIN / MAX of column, when other columns in same table DO / DONT have NULL 【发布时间】:2017-05-02 06:39:55 【问题描述】:我有一些 Postgres SELECT 查询,这些查询是根据通过 php 的表单输入拼凑而成的。其中之一是一个 SELECT 查询,该查询旨在检索每个字段中的最小值(我也有一个查找最大值)。
例如对于最小值:
SELECT
MIN(col1) "Min_col1"
MIN(col2) "Min_col2"
MIN(col3) "Min_col3"
FROM table
不幸的是,我的表中有很多 NULL 值,分布在所有字段中。为了解决这个问题,我在表单中添加了复选框,允许用户选择是否应在此查询中包含/排除 NULL 值。
例如,如果用户想为所有列包含 NULL 值:
SELECT
MIN(col1) "Min_col1"
MIN(col2) "Min_col2"
MIN(col3) "Min_col3"
FROM table
WHERE
(col1 IS NULL) AND
(col2 IS NULL) AND
(col3 IS NULL)
但是,由于每个字段至少有一个 NULL 值,因此上述查询将返回所有 NULL。
我想要的是能够检索每个字段的 MIN,同时包括/排除其他字段的 NULL 值。例如MIN(col1) 同时包括/排除 col2、col2 和 col3 等的 NULLS。
解决这个问题的最简单方法是什么?请记住,查询是通过 PHP 从表单输入组合在一起的,因此希望尽可能保持模块化...
【问题讨论】:
你能检查一下吗 - ***.com/questions/12009817/… 有帮助的:***.com/questions/19029842/… 选择 min('Include' = parameter 的情况,然后 col1 为空的情况,然后 0 else col1 end else col1 end ),min('Include' = parameter 的情况,然后的情况col2 为 null 然后 0 else col2 end else col2 end) from your_table 其中 parameter 值为“包含”或“排除”。使用您的复选框参数设置这些值。让我知道它是否有效。 【参考方案1】:对于下面的查询,如果 null_only::boolean 为 false,则返回 min,否则返回 null:
SELECT
case when not null_only then MIN(col1) else null end "Min_col1"
, case when not null_only then MIN(col2) else null end "Min_col2"
, case when not null_only then MIN(col3) else null end "Min_col3"
FROM table
WHERE
(col1 IS NULL) AND
(col2 IS NULL) AND
(col3 IS NULL)
这是准备好的语句的工作示例:
t=# prepare q1 (boolean) as select case when not $1 then MIN(oid) else null end col1 from pg_class;
PREPARE
Time: 10.905 ms
t=# execute q1(true);
col1
------
(1 row)
Time: 6.216 ms
t=# execute q1(false);
col1
------
112
(1 row)
Time: 7.169 ms
【讨论】:
【参考方案2】:如果要确保某个值不为空,请使用 coalesce(columnName, valueToBeUsed)。所以在你的例子中,你可能想使用MIN(coalesce(col1,0))
【讨论】:
以上是关于查找列的 MIN / MAX,当同一张表中的其他列 DO / DONT 有 NULL的主要内容,如果未能解决你的问题,请参考以下文章