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

21

我正在编写一个在Postgres中的存储过程,需要检查一行是否存在,然后相应地执行操作。类似以下内容。

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

我已经谷歌了一下,但没有找到什么好的结果。

2个回答

30

27

使用 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 如此复杂"

有没有找到一些隐含的变量?我尝试在文档中查找它们被提到的地方,但是由于这个术语过于普遍,我没有找到。 - ams
从上面链接的页面中,@ams提到:“此外,如果查询至少返回一行结果,则特殊变量FOUND被设置为true;如果查询没有返回任何结果,则设置为false(参见第39.5.5节)”。请参阅39.5.5. 获取结果状态;在PL/PgSQL的“基本语句”页面中也有其他地方提到。 - Craig Ringer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接