psql从变量表名复制?

时间:2015-09-08 22:23:00

标签: psql greenplum

出于某种原因,下面的代码在psql中打破,因为在\ copy阶段提供了Greenplum:

\set tmp1 public.tmp1

DROP TABLE IF EXISTS :tmp1;
CREATE TABLE :tmp1 (new_id varchar(255), old_id BIGINT) DISTRIBUTED BY (old_id);
\echo :tmp1
\copy :tmp1 FROM 'file1.csv' WITH DELIMITER '|' HEADER CSV;
ERROR:  syntax error at or near ":"
LINE 1: COPY  :tmp1 FROM STDIN WITH DELIMITER '|' HEADER CSV;

如何在psql中使用带有copy命令的变量表名?

1 个答案:

答案 0 :(得分:0)

我认为这与 greenplum 或旧的 PostgreSQL 版本无关。 \copy 元命令不会将变量扩展为 documented here:

<块引用>

与大多数其他元命令不同,该行的其余部分始终被视为 \copy 的参数,并且在参数中既不执行变量插值,也不执行反引号扩展。

要解决此问题,您可以分多个步骤构建、存储和执行命令。将您的 \copy ... 行替换为

\set cmd '\\copy ' :tmp1 ' FROM ''file1.csv'' WITH DELIMITER ''|'' HEADER CSV'
:cmd

有了这个,您需要在嵌入的元命令中加倍(转义)\'。请记住,\set 会将所有进一步的参数连接到第二个参数,因此您需要在参数之间引用空格。