【问题标题】:double-quotes around hyphenated table name fails带连字符的表名周围的双引号失败
【发布时间】:2018-06-08 00:12:41
【问题描述】:

我们使用 SaaS 软件从云端提取营销数据。当我尝试将查询结果转储到这样的 CSV 文件时

psql my.server -p 5432 -U myuser -d mydb -c "\copy (SELECT 
c.*,cip.*,cipi.* FROM saas.contacts c LEFT JOIN 
saas."contacts__identity-profiles" cip ON 
cip."_sdc_source_key_vid" = c.vid LEFT JOIN 
saas."contacts__identity-profiles__identities" cipi ON 
cipi."_sdc_source_key_vid" = cip."_sdc_source_key_vid" AND 
cipi."_sdc_level_0_id" = cip."_sdc_level_0_id") to 
'/tmp/contacts.csv' DELIMITER ',' CSV HEADER "

失败并出现以下错误

ERROR:  syntax error at or near "-"
LINE 1: ...EFT JOIN saas.contacts__identity-profiles ...

我知道 Postgres 要求我在带连字符的表名周围加上双引号,但这显然不起作用。我试过了

  • "contacts__identity\-profiles" 那样转义表名中的连字符,但无济于事
  • 在表名周围加双引号,但无济于事。

这个问题似乎与在 COPY 命令中使用双引号有关。有什么办法可以解决这个问题?

【问题讨论】:

  • 您是否尝试过自己转义双引号?
  • @ccjmne 我也试过了。没有运气。

标签: postgresql


【解决方案1】:

你有双引号同时做两个不同的事情:

  • 外部双引号用于bash 将该命令作为一个参数传递给psql
  • 内部双引号用于 PostgreSQL,以便您可以引用连字符标识符。

您需要转义内部引号以使它们通过bash 并进入psql

psql my.server -p 5432 -U myuser -d mydb -c "... saas.\"contacts__identity-profiles\" ..."
# ----------------------------------------------------^^ ------------------------- ^^

等等。将它们全部转义(来自bash)会给你:

psql my.server -p 5432 -U myuser -d mydb -c "\copy (SELECT c.*,cip.*,cipi.* FROM saas.contacts c LEFT JOIN saas.\"contacts__identity-profiles\" cip ON cip.\"_sdc_source_key_vid\" = c.vid LEFT JOIN saas.\"contacts__identity-profiles__identities\" cipi ON cipi.\"_sdc_source_key_vid\" = cip.\"_sdc_source_key_vid\" AND cipi.\"_sdc_level_0_id\" = cip.\"_sdc_level_0_id\") to '/tmp/contacts.csv' DELIMITER ',' CSV HEADER "

【讨论】:

  • 我错误地转义了双引号。你的回答让我意识到了这一点。谢谢你。接受并投票。
【解决方案2】:

您可以尝试将完整的命令放在单引号中,然后在里面使用双引号用于其他用途,如下所示:

psql my.server -p 5432 -U myuser -d mydb -c '\copy (SELECT 
c.*,cip.*,cipi.* FROM saas.contacts c LEFT JOIN 
saas."contacts__identity-profiles" cip ON 
cip."_sdc_source_key_vid" = c.vid LEFT JOIN 
saas."contacts__identity-profiles__identities" cipi ON 
cipi."_sdc_source_key_vid" = cip."_sdc_source_key_vid" AND 
cipi."_sdc_level_0_id" = cip."_sdc_level_0_id") to 
"/tmp/contacts.csv" DELIMITER "," CSV HEADER '

希望这会有所帮助!

【讨论】:

  • 没有变化。我仍然收到ERROR: syntax error at or near "-" LINE 1: ...EFT JOIN saas.contacts__identity-profiles ...
猜你喜欢
  • 2018-10-29
  • 2020-08-29
  • 2011-01-27
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多