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)
| 归档时间: |
|
| 查看次数: |
18278 次 |
| 最近记录: |