当同一个表中的其他列DO / DONT为NULL

时间:2017-05-02 06:39:55

标签: php postgresql

我有一些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从表单输入组合在一起的,所以希望尽可能保持模块化...

2 个答案:

答案 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))