我有一些Postgres SELECT查询,它们根据PHP的表单输入拼凑在一起。其中一个是SELECT查询,它查找每个字段中的最小值(我也有一个找到最大值)。
e.g。对于最小值:
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值,因此上述查询将返回所有NULLS。
我想要的是能够为每个字段检索MIN,同时包括/排除其他字段的NULL值。例如MIN(col1)同时包括/排除NULLS为col2,col2& col3等。
最简单的方法是什么?请记住,查询是通过PHP从表单输入组合在一起的,所以希望尽可能保持模块化...
答案 0 :(得分: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
答案 1 :(得分:0)
如果要确保值不为null,则使用coalesce(columnName,valueToBeUsed)。因此,在您的示例中,您可能希望使用MIN(coalesce(col1,0))