我在postgres中编写存储过程,我需要检查是否存在行,然后相应地执行操作。沿途的东西。
IF SELECT * FROM foo WHERE x = 'abc' AND y = 'xyz' THEN
-- do something here
ELSE
-- do something else
END;
我谷歌搜索了一下,但没有得到很好的点击。
答案 0 :(得分:17)
甚至更简单EXISTS
:
IF EXISTS (SELECT 1 FROM foo WHERE x = 'abc' AND y = 'xyz') THEN
....
END IF;
答案 1 :(得分:13)
使用PERFORM
and the FOUND
automatic variable:
PERFORM * FROM foo WHERE x = 'abc' AND y = 'xyz';
IF FOUND THEN
....
END IF;
如果返回一个或更多行,则会成功。如果您想将结果限制在一行use GET DIAGNOSTICS
to get the row count,或者使用SELECT INTO
将count(...)
行存储到DECLARE
d变量中,那么请进行测试。如果没有结果是错误,请使用SELECT INTO STRICT
要求获取恰好一行并将其存储到目标变量中。
做这样的事情时要小心并发问题。如果您正在尝试编写upsert / merge函数,则此方法将无法正常工作。请参阅"why is upsert so complicated"。