查找列的 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的主要内容,如果未能解决你的问题,请参考以下文章

MySQL学习笔记:时间差

用 Oracle 中同一张表中的其他行数据更新一行

如何将特定列单元格映射到同一张表中的其他特定列单元格?

如何根据同一张表中的其他列匹配替换空值

使用 DB2,您如何为一列选择具有 MAX 的行,然后在同一张表的另一列的结果子集中选择具有 MAX 的行?

sql 将多行显示为一行,如果一张表中有几行数据中的同一列的值是相同,那么只显示为一行的数据