19

我在 postgres 中编写了一个存储过程,我需要检查是否存在一行,然后采取相应的行动。沿线的东西。

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

我用谷歌搜索了一下,但没有得到好的结果。

4

2 回答 2

29

甚至更简单EXISTS

IF EXISTS (SELECT FROM foo WHERE x = 'abc' AND y = 'xyz') THEN
    ...
END IF;

看:

于 2012-10-11T05:54:04.750 回答
25

使用PERFORMFOUND自动变量

PERFORM * FROM foo WHERE x = 'abc' AND y = 'xyz';
IF FOUND THEN
    ....
END IF;

如果返回一行或多行,这将成功。如果您想将结果限制为恰好一行,则用于GET DIAGNOSTICS获取行数,或用于SELECT INTO将行存储count(...)DECLAREd 变量中,然后进行测试。如果没有结果是错误的,请使用SELECT INTO STRICT要求仅获取一行并将其存储到目标变量中。

做这样的事情时要小心并发问题。如果您尝试编写 upsert/merge 函数,这种方法将不起作用。请参阅“为什么 upsert 如此复杂”

于 2012-10-11T03:23:55.573 回答