最终目的:生成一个查询,如果表存在,则执行该表的语句
我只是在架构中存在某个表时才尝试执行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...
^
没有比此更多的代码了。我试过的所有替代品都失败了。
答案 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行)