执行select语句IF表存在

时间:2018-06-04 10:32:54

标签: 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;

输出是......

ERROR:  syntax error at or near "IF"
LINE 1: IF EXISTS(SELECT 1 FROM information_schema.tables WHERE tabl...
        ^

没有比此更多的代码了。我试过的所有替代品都失败了。

3 个答案:

答案 0 :(得分:1)

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

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将失败。而AFAIK没有办法让函数返回一个可变形状的表。

注意:如果您实际上不想返回查询结果但是执行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;

答案 1 :(得分:-1)

试试这个解决方案:

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

答案 2 :(得分:-1)

您可以尝试以下代码:

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';

没有表和有效表运行时的结果:

----没有表

----(受影响的830行)