如何在 PL/pgSQL 函数中将 WITH 与 IF 一起使用

How can I use WITH together with IF in PL/pgSQL function

CREATE OR REPLACE FUNCTION test()
RETURNS boolean security definer AS
$BODY$

BEGIN

with zzz as (select foo from data)

 IF EXISTS (select 1 from zzz) THEN
 
  return true;
  
  ELSE
     return false;
  END IF;

END;
$BODY$
LANGUAGE plpgsql VOLATILE;
ERROR:  syntax error at or near "IF"
LINE 10:  IF EXISTS (select 1 from zzz) THEN

问题出在哪里?

简化为单个 return 语句:

return exists(select foo from data);

最后我用了:

$BODY$

BEGIN

DROP TABLE IF EXISTS mytable;
CREATE TEMP TABLE mytable AS

SELECT foo from data;

 IF EXISTS (select 1 from mytable) THEN
 
  return true;
  
  ELSE
     return false;
  END IF;


END;
$BODY$

就像 Bohemian 提供的那样,您可以从根本上简化为:

RETURN EXISTS(SELECT foo FROM data);

但是,这表明 foo 很重要,但事实并非如此(如果该列存在,否则会引发异常)。 EXISTS returns true 如果至少返回一行,无论内容如何:为此目的甚至可以是所有 NULL 值。否则它 returns false。从来没有null。减少误导:

RETURN EXISTS(SELECT * FROM data);
RETURN EXISTS(SELECT 1 FROM data);

Postgres 也接受一个空的 SELECT 列表(我的偏好):

RETURN EXISTS(SELECT FROM data);

参见:

  • What is easier to read in EXISTS subqueries?

或者在简单情况下使用语法 shorthand TABLE

RETURN EXISTS(TABLE data);

参见:

PL/pgSQL 对于简单的情况来说太过分了,一个简单的 SQL 函数或者只是简单的语句就可以了:

SELECT EXISTS(TABLE data);

要将逻辑集成到更复杂的 PL/pgSQL 函数中,特殊变量 FOUND(如 )通常很有用。或 GET DIAGNOSTICS ... 用于动态 SQL.

参见:

  • Dynamic SQL (EXECUTE) as condition for IF statement