IF表存在则执行select语句

MAR*_*.RS 8 sql postgresql if-statement psql postgresql-9.6

最终目的:生成一个查询,如果表存在,则为该表执行一条语句

仅当架构中存在某个表时,我才尝试执行 PSQL (9.6) 语句,但每次我尝试使用条件时,它总是会响应语法错误IF

我的查询是这样的...

IF EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'users') THEN
  SELECT * FROM users;
END IF;
Run Code Online (Sandbox Code Playgroud)

输出是...

ERROR:  syntax error at or near "IF"
LINE 1: IF EXISTS(SELECT 1 FROM information_schema.tables WHERE tabl...
        ^
Run Code Online (Sandbox Code Playgroud)

没有比这更多的代码了。我尝试过的所有替代方案都失败了。

sti*_*bit 11

您可以(并且可能必须)将其包装在一个函数中。

CREATE FUNCTION select_if_exists
                ()
RETURNS TABLE (id integer,
               foo text)
AS
$$
BEGIN
  IF EXISTS(SELECT *
                   FROM information_schema.tables
                   WHERE table_schema = current_schema()
                         AND table_name = 'elbat') THEN
    RETURN QUERY SELECT elbat.id,
                        elbat.foo
                        FROM elbat;
  END IF;
END;
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

如果你打电话

SELECT *
       FROM select_if_exists();
Run Code Online (Sandbox Code Playgroud)

当表不存在时,您将得到空集。

创建表,再次调用它,您将获得表的内容。

CREATE TABLE elbat
             AS SELECT 1::integer id,
                       'Hello World!'::text foo;

SELECT *
       FROM select_if_exists();
Run Code Online (Sandbox Code Playgroud)

但是,如果因为表不存在或因为表为空而得到空集,则无法仅通过调用函数来区分外部。那么你就必须RAISE出错(但是如果你想要的话,你可以使用一个正常的,SELECT无论如何,如果目标表不存在的话。)

并且该表必须具有预期的列。否则SELECT函数中的函数将失败。

注意:如果您实际上不想返回查询结果但执行 DML(或者 DDL 也应该起作用),您也可以将其放在匿名块中而不定义函数。例子:

DO
$$
BEGIN
  IF EXISTS(SELECT *
                   FROM information_schema.tables
                   WHERE table_schema = current_schema()
                         AND table_name = 'elbat') THEN
    DELETE FROM elbat;
  END IF;
END;
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)


Kav*_*tel -1

尝试这个解决方案:

 SELECT * FROM table_name
 WHERE EXISTS 
    (
        SELECT 1
        FROM information_schema.tables 
        WHERE table_schema = 'schema_name'
        AND table_name = 'table_name'
    );
Run Code Online (Sandbox Code Playgroud)