有条件地执行 select 语句
Execute select statement conditionally
我正在使用 PostgreSQL 9.6,我需要创建一个查询来根据 if
的逻辑执行 select
基本上我试过:
DO $$
BEGIN
IF exists ( SELECT 1 FROM TABLE WHERE A = B ) THEN
SELECT *
FROM A
ELSE
SELECT *
FROM B
END IF
END $$
那 returns 我是个错误:
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM
instead.
CONTEXT: PL/pgSQL function inline_code_block line 15 at SQL statement
然后我将“SELECT”切换为“PERFORM”,但这实际上并没有为我执行 SELECT 语句。
我读到我需要调用 void 函数来执行“动态”查询,但我也做不到。我不熟悉在 PostgreSQL 上编写查询。有更好的方法吗?
匿名代码块不能return任何东西——你需要一个函数。
但我认为你不需要 pl/pgsql 来做你想做的事。假设 a
和 b
具有相同的列数和数据类型,您可以使用 union all
和 not exists
:
select a.* from a where exists (select 1 from mytable where ...)
union all
select b.* from b where not exists (select 1 from mytable where ...)
DO
语句不带参数,也不 return 任何东西。参见:
您可能需要一个函数。创建一次:
CREATE FUNCTION foo()
RETURNS SETOF A -- or B, all the same
LANGUAGE plpgsql AS
$func$
BEGIN
IF EXISTS (SELECT FROM ...) THEN -- some meaningful test
RETURN QUERY
SELECT *
FROM A;
ELSE
RETURN QUERY
SELECT *
FROM B;
END IF;
END
$func$
通话:
SELECT * FROM foo();
但是函数有一个声明的return类型。所以两个表 A
和 B
必须共享相同的列(至少具有相同顺序的兼容数据类型的列;名称没有问题)。
同样的限制适用于普通的 SQL 语句。 SQL 严格键入。
我正在使用 PostgreSQL 9.6,我需要创建一个查询来根据 if
的逻辑执行 select基本上我试过:
DO $$
BEGIN
IF exists ( SELECT 1 FROM TABLE WHERE A = B ) THEN
SELECT *
FROM A
ELSE
SELECT *
FROM B
END IF
END $$
那 returns 我是个错误:
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function inline_code_block line 15 at SQL statement
然后我将“SELECT”切换为“PERFORM”,但这实际上并没有为我执行 SELECT 语句。
我读到我需要调用 void 函数来执行“动态”查询,但我也做不到。我不熟悉在 PostgreSQL 上编写查询。有更好的方法吗?
匿名代码块不能return任何东西——你需要一个函数。
但我认为你不需要 pl/pgsql 来做你想做的事。假设 a
和 b
具有相同的列数和数据类型,您可以使用 union all
和 not exists
:
select a.* from a where exists (select 1 from mytable where ...)
union all
select b.* from b where not exists (select 1 from mytable where ...)
DO
语句不带参数,也不 return 任何东西。参见:
您可能需要一个函数。创建一次:
CREATE FUNCTION foo()
RETURNS SETOF A -- or B, all the same
LANGUAGE plpgsql AS
$func$
BEGIN
IF EXISTS (SELECT FROM ...) THEN -- some meaningful test
RETURN QUERY
SELECT *
FROM A;
ELSE
RETURN QUERY
SELECT *
FROM B;
END IF;
END
$func$
通话:
SELECT * FROM foo();
但是函数有一个声明的return类型。所以两个表 A
和 B
必须共享相同的列(至少具有相同顺序的兼容数据类型的列;名称没有问题)。
同样的限制适用于普通的 SQL 语句。 SQL 严格键入。