如果没有找到记录,则返回零

时间:2013-07-24 16:01:33

标签: sql postgresql null plpgsql coalesce

我在存储过程中有一个查询,它对表中的一些值求和:

SELECT SUM(columnA) FROM my_table WHERE columnB = 1 INTO res;

在此选择之后,我用另一个查询检索的整数减去res值并返回结果。如果验证WHERE子句,则一切正常。但如果不是,我的所有函数返回都是一个空列(可能因为我试图减去一个空值的整数)。

如果不满足WHERE子句,如何使查询返回零?

3 个答案:

答案 0 :(得分:56)

你可以:

SELECT COALESCE(SUM(columnA), 0) FROM my_table WHERE columnB = 1 INTO res;

这恰好起作用,因为你的查询有一个聚合函数,因此总是返回一行,即使在基础表中找不到任何内容。

在这种情况下,没有聚合的普通查询会返回 无行 COALESCE永远不会被召唤,无法拯救你。在处理单个列时,我们可以包装整个查询:

SELECT COALESCE( (SELECT columnA FROM my_table WHERE ID = 1), 0)
INTO res;

也适用于您的原始查询:

SELECT COALESCE( (SELECT SUM(columnA) FROM my_table WHERE columnB = 1), 0)
INTO res;

有关COALESCE() in the manual的更多信息 有关aggregate functions in the manual的更多信息 在后面的帖子中有更多替代

答案 1 :(得分:2)

我不熟悉postgresql,但在SQL Server或Oracle中,使用子查询的方式如下(在Oracle中,SELECT 0将是SELECT 0 FROM DUAL

SELECT SUM(sub.value)
FROM
( 
  SELECT SUM(columnA) as value FROM my_table
  WHERE columnB = 1
  UNION
  SELECT 0 as value
) sub

也许这对postgresql也有效?

答案 2 :(得分:-1)

您也可以尝试:(我试过这个,它对我有用)

SELECT ISNULL((SELECT SUM(columnA) FROM my_table WHERE columnB = 1),0)) INTO res;