Postgres / SQL

时间:2019-06-05 00:47:30

标签: sql postgresql null

我希望查询返回两列中的最小值。但是,如果col1和col2均为NULL,则返回NULL。我已经尝试了coalesce()和nvl(),但是当col1和col2均为NULL时,两者都无法处理。

对于col1 = 3和col = 2:

select least(coalesce(3, 1000000), coalesce(2, 1000000))

这有效,输出为2。

这也适用于col1 = 3和col2 = NULL:

select least(coalesce(3, 1000000), coalesce(NULL, 1000000))

但是,当col1 = NULL和col2 = NULL时,这不起作用

select least(coalesce(null, 1000000), coalesce(null, 1000000))

这给了我1000000而不是null。 如何解决这种情况?

3 个答案:

答案 0 :(得分:3)

这个问题还不清楚。我相信您正在尝试比较表的两列。空值没有价值。因此,当您在minimum()中使用它时,除非所有比较的值都为空,否则将始终返回非空值。因此,您可以按以下方式将0替换为null。

select least(coalesce(0, value_1), coalesce(0, value_2));

答案 1 :(得分:1)

您还可以使用case语句比较两个列。

  CREATE TABLE emp_data (
Value1 int , 
value2 int
);

insert into emp_data (value1, value2) values (100, 200), (200,200), (300,150) 

Select case when value1 > value2 then value2
when value1 < value2 then value1  else null end as Comparison, value1, value2
from emp_data

输出:

Comparison Value1 value2 
     100         100    200
                 200    200
     150         300    150

这是小提琴:

https://dbfiddle.uk/?rdbms=postgres_10&fiddle=fbd19a9bbc6563d700495fa487888606

答案 2 :(得分:1)

您可以使用横向连接:

select t.*, x.least_val
from (values (2, 3)) t(col1, col2) cross join lateral
     (select min(col) as least_val
      from (values (t.col1), (t.col2)) v(col)
     ) x;

您似乎想要min()的语义,因此这恰好是min()

如果您确实要使用least()和一个“魔术”值,则可以使用nullif()

select nullif(least(coalesce(3, 1000000), coalesce(NULL, 1000000)), 1000000)