出于某种原因,下面的代码在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命令的变量表名?
答案 0 :(得分:0)
我认为这与 greenplum 或旧的 PostgreSQL 版本无关。 \copy
元命令不会将变量扩展为 documented here:
与大多数其他元命令不同,该行的其余部分始终被视为 \copy 的参数,并且在参数中既不执行变量插值,也不执行反引号扩展。
要解决此问题,您可以分多个步骤构建、存储和执行命令。将您的 \copy ...
行替换为
\set cmd '\\copy ' :tmp1 ' FROM ''file1.csv'' WITH DELIMITER ''|'' HEADER CSV'
:cmd
有了这个,您需要在嵌入的元命令中加倍(转义)\
和'
。请记住,\set
会将所有进一步的参数连接到第二个参数,因此您需要在参数之间引用空格。