如何在 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
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