postgresql 如果表存在,则执行选择语句

0h4hbjxa  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(4)|浏览(227)

最终目的:生成查询,如果表存在,则执行该表的语句
我尝试只在模式中存在某个表时执行PSQL(9.6)语句,但每次尝试使用条件IF时,它总是返回语法错误。
我的问题是...

IF EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'users') THEN
  SELECT * FROM users;
END IF;

输出结果是...

ERROR:  syntax error at or near "IF"
LINE 1: IF EXISTS(SELECT 1 FROM information_schema.tables WHERE tabl...
        ^
  • 没有比这更多的代码 *。我尝试的所有替代方案都失败了。
xhv8bpkk

xhv8bpkk1#

你可以(而且很可能必须)将其 Package 在一个函数中。

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;

如果你打电话

SELECT *
       FROM select_if_exists();

当表不存在时,得到空集。
创建表,再次调用它,您将获得表的内容。

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

SELECT *
       FROM select_if_exists();

但是你不能从外部区分,仅仅通过调用函数,如果你得到一个空集,因为表不存在或者因为它是空的。那么您必须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;
m2xkgtsf

m2xkgtsf2#

要使用query而不是function来实现这一点,下面是SQL代码:

select 'users_EXISTS', table_name,
   case
       when table_name = null then 0
       else 1
   end
    as table_exists 
from information_schema.tables where table_schema = 'public' and table_name = 'users';

在else而不是1中,可以将你的语句for“execute a statement

t1qtbnec

t1qtbnec3#

你可以试试下面的代码:

select * from users
where exists (select table_name 
from information_schema.tables
where table_name = 'users');

然而,如果你提供你完整的块/目的,它将有助于给你一个更好的结果。
更新查询:

if (select count(*) from information_schema.tables where table_name = 
'order') = 1 
SELECT * FROM "order" ;
else print N'No Table';

不带表和带有效表运行时的结果:
----没有table
----(830行受影响)

ahy6op9u

ahy6op9u4#

试试这个解决方案:

SELECT * FROM table_name
 WHERE EXISTS 
    (
        SELECT 1
        FROM information_schema.tables 
        WHERE table_schema = 'schema_name'
        AND table_name = 'table_name'
    );

相关问题