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

ams*_*ams 13 postgresql stored-procedures exists plpgsql

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

IF SELECT * FROM foo WHERE x = 'abc' AND y = 'xyz' THEN
  -- do something here
ELSE 
  -- do something else
END;
Run Code Online (Sandbox Code Playgroud)

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

Erw*_*ter 21

甚至更简单EXISTS:

IF EXISTS (SELECT 1 FROM foo WHERE x = 'abc' AND y = 'xyz') THEN
    ....
END IF;
Run Code Online (Sandbox Code Playgroud)


Cra*_*ger 17

使用PERFORMFOUND自动变量:

PERFORM * FROM foo WHERE x = 'abc' AND y = 'xyz';
IF FOUND THEN
    ....
END IF;
Run Code Online (Sandbox Code Playgroud)

如果返回一行或多行,则会成功.如果要将结果限制为恰好一行用于GET DIAGNOSTICS获取行计数,或者用于将行SELECT INTO存储count(...)DECLAREd变量中,则测试.如果没有结果是错误,请使用SELECT INTO STRICT要求只获取一行并存储到目标变量中.

做这样的事情时要小心并发问题.如果您正在尝试编写upsert/merge函数,则此方法将无效.请参阅"为什么这么复杂".