减法在postgres中给出null

时间:2019-01-18 11:28:23

标签: sql postgresql

我有一个表temp(id int,name text)和另一个表temp2(id int,times int)。临时存储(1,'a'),(2,'b')和(3,'c')。 temp2存储(1,1)和(2,2)。我想找到一个字符的id和它来的次数之间的区别。由于“ c”未出现在temp2列中,因此其时间为null。此外,请注意,我无法以任何方式编辑给定的表。这是我所做的:-

SELECT name, temp.id,
CASE WHEN times=null THEN temp.id
    ELSE temp.id-times
END
FROM temp LEFT OUTER JOIN temp2
ON (temp.id=temp2.id);

但是,这样做的问题是它仍然给我以下输出:-

 name | id | case 
------+----+------
 a    |  1 |    0
 b    |  2 |    0
 c    |  3 |     

(3 rows)

(请注意,对于c,大小写为null)。请帮我解决这个问题。谢谢!

1 个答案:

答案 0 :(得分:1)

使用coalesce()

SELECT name, temp.id,
       temp.id - COALESCE(times, 0)
FROM temp LEFT OUTER JOIN
     temp2
     ON temp.id = temp2.id;

您的特定问题是比较= NULL。正确的方法是IS NULL。在SQL中,任何事物都不能等同于NULL,因此永远不会返回TRUE

但是,COALESCE()是表达逻辑的一种简单方法。