有条件地执行 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 来做你想做的事。假设 ab 具有相同的列数和数据类型,您可以使用 union allnot 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类型。所以两个表 AB 必须共享相同的列(至少具有相同顺序的兼容数据类型的列;名称没有问题)。
同样的限制适用于普通的 SQL 语句。 SQL 严格键入。