我在一个存储过程中有一个查询,它对表中的一些值求和:
SELECT SUM(columnA) FROM my_table WHERE columnB = 1 INTO res;
在这个选择之后,我用另一个查询检索到的整数减去res
值并返回结果。如果WHERE
子句得到验证,一切正常。但如果不是,我的所有函数返回的是一个空列(可能是因为我尝试用一个空值减去一个整数)。
WHERE
如果不满足子句,如何使查询返回零?
我在一个存储过程中有一个查询,它对表中的一些值求和:
SELECT SUM(columnA) FROM my_table WHERE columnB = 1 INTO res;
在这个选择之后,我用另一个查询检索到的整数减去res
值并返回结果。如果WHERE
子句得到验证,一切正常。但如果不是,我的所有函数返回的是一个空列(可能是因为我尝试用一个空值减去一个整数)。
WHERE
如果不满足子句,如何使查询返回零?
你可以:
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()
手册。手册中有关聚合函数的
更多信息。稍后发布的
更多替代方案:
我不熟悉 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?
你也可以试试:(我试过这个,它对我有用)
SELECT ISNULL((SELECT SUM(columnA) FROM my_table WHERE columnB = 1),0)) INTO res;
您可以使用exists
从句。
IF EXISTS(SELECT FROM my_table WHERE columnB = 1)
THEN
res := SUM(columnA);
ELSE
res := 0
END IF;