如何检查PostgreSQL存储过程中是否存在行?

时间:2012-10-11 03:17:59

标签: postgresql stored-procedures plpgsql exists

我在postgres中编写存储过程,我需要检查是否存在行,然后相应地执行操作。沿途的东西。

IF SELECT * FROM foo WHERE x = 'abc' AND y = 'xyz' THEN
  -- do something here
ELSE 
  -- do something else
END;

我谷歌搜索了一下,但没有得到很好的点击。

2 个答案:

答案 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 INTOcount(...)行存储到DECLARE d变量中,那么请进行测试。如果没有结果是错误,请使用SELECT INTO STRICT要求获取恰好一行并将其存储到目标变量中。

做这样的事情时要小心并发问题。如果您正在尝试编写upsert / merge函数,则此方法将无法正常工作。请参阅"why is upsert so complicated"