【问题标题】:PostgreSQL GREATEST with NULLs带有 NULL 的 PostgreSQL GREATEST
【发布时间】:2020-02-06 11:05:16
【问题描述】:

使用 PostgreSQL,我正在寻找类似 @​​987654322@ 的东西,其中 x 可以是 NULL。在x IS NULL 的情况下,查询应该返回NULL,类似于MySQL 和Google BigQuery,而不是0,这是PostgreSQL 中的标准行为。有没有没有条件和条件的简单方法?

SELECT GREATEST(0,NULL) 应该返回 NULL,而不是 0

在官方文档中:

GREATEST 和 LEAST 函数选择最大值或最小值 从任意数量的表达式列表中。表达式必须都是 可转换为通用数据类型,这将是 结果(详见第 10.5 节)。列表中的 NULL 值是 忽略。仅当所有表达式都计算时,结果才会为 NULL 为 NULL。

请注意,GREATEST 和 LEAST 不在 SQL 标准中,而是 共同扩展。其他一些数据库使它们返回NULL(如果有) 参数为 NULL,而不是仅当全部为 NULL 时。

https://www.postgresql.org/docs/9.6/functions-conditional.html

我正在寻找一个不会忽略 NULL 的 GREATEST 函数

【问题讨论】:

  • 使用这么旧版本的 PostgreSQL 有什么特别的原因吗?如果它不再受支持,我不会感到惊讶
  • 我正在使用这个版本:PostgreSQL 9.6.11 on x86_64-pc-linux-gnu,由 gcc (GCC) 4.8.3 编译 20140911 (Red Hat 4.8.3-9), 64-位
  • 您是否希望greatest(1,2,null,4,5) 也为 NULL?
  • 正确,预期的行为是最大的(1,2,null)应该返回NULL
  • 更新了问题以在标签、URL 和描述中使用正确的版本号。

标签: sql postgresql postgresql-9.6


【解决方案1】:

你可以自己写函数:

create function strange_greatest(variadic p_input int[])
  returns int
as
$$
  select v
  from unnest(p_input) as t(v)
  order by t desc nulls first
  limit 1;
$$
language sql
immutable;
postgres=> select strange_greatest(1,2,4);
strange_greatest
----------------
               4
(1 row)

postgres=> select strange_greatest(1,2,null,4);
strange_greatest
----------------

(1 row)

【讨论】:

    【解决方案2】:

    您可以添加另一个表达式。对于数字:

    select greatest(a, b, c) + (a + b + c - (a + b + c))
    

    这对于其他数据类型来说更具挑战性。但是数组可以提供帮助:

    select greatest(a, b, c) * nullif( array_position(array[a, b, c], null) is not null), true )::int
    

    【讨论】:

      【解决方案3】:

      对于2个数字(列)的情况,如果你的表格是这样的:

      create table tablename(a int, b int);
      
      insert into tablename(a, b) values
      (10, 20), (null, 30), (40, null);
      

      然后像这样使用函数greatest()

      select 
        greatest((a + b) - b, (a + b) - a) "greatest"
      from tablename;
      

      如果abnull,那么两个表达式:(a + b) - b(a + b) - a 都是null 并且函数greatest() 将返回null
      请参阅demo
      结果:

      | greatest |
      | -------- |
      | 20       |
      | null     |
      | null     |
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-11
        • 2011-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-23
        • 2012-07-13
        相关资源
        最近更新 更多