Postgresql 将SELECT的结果连接到EXECUTE

Postgresql 将SELECT的结果连接到EXECUTE,postgresql,psql,Postgresql,Psql,我正在尝试使用匿名代码块中的EXECUTE(DO$$…BEGIN…END$$)从定义的备份中重新创建视图,但无法使其工作。这大概是我到目前为止的情况: EXECUTE 'CREATE VIEW image AS (' || (SELECT definition FROM tmp_view_backup WHERE viewname = 'image') || ')'; 具有视图定义备份的表是这样创建的 CREATE TABLE tmp_view_backup AS (select viewn

我正在尝试使用匿名代码块中的EXECUTE(
DO$$…BEGIN…END$$
)从定义的备份中重新创建视图,但无法使其工作。这大概是我到目前为止的情况:

EXECUTE 'CREATE VIEW image AS (' || (SELECT definition FROM tmp_view_backup WHERE viewname = 'image') || ')';
具有视图定义备份的表是这样创建的

CREATE TABLE  tmp_view_backup
AS
(select viewname,definition from pg_views
WHERE schemaname = 'public'
);
似乎是select在创建字符串时给我带来了一些问题,因为结果与我预期的完全不同:

postgres=# select char_length('CREATE VIEW image AS ('  || (SELECT definition FROM tmp_view_backup WHERE viewname = 'image') || ')') as f ;
 f 
---

(1 row)

这是什么?空行?如果我放弃选择,我会得到一个正常的答案(比如字符串长度为
23
)。

您可以使用PSQL
\gexec
参数

SELECT format('CREATE VIEW image AS  %s ', definition)
FROM tmp_view_backup 
WHERE viewname = 'image';\gexec  
或者在DO块中

DO $$
BEGIN

EXECUTE format('CREATE VIEW image AS  %s ', definition)
FROM  tmp_view_backup 
WHERE viewname = 'image';
END $$;

@参见编辑。应使用格式类型
%s
。视图定义包括最后的分号。我想这意味着我需要删除最后一个字符<代码>其中(enc_img.conference_id=patient_id_for_conference.id))pid开启(true));)
(1行)
错误:语法错误位于或接近“;”
第20行:…计数器\u id=patient\u id\u for_conference.id))pid开启(true));)@oligofren:或者不要在它周围放不必要的括号。@oligofren它应该可以工作。请注意,我已从
创建视图为%s
语句中删除了括号。或者,
从tmp\u视图备份中选择格式(“创建视图图像为(%s)”,substr(定义,0,长度(定义))。
:-)