【问题标题】:How to handle quoted values in AWS Redshift unload command?如何处理 AWS Redshift 卸载命令中的引用值?
【发布时间】:2019-03-15 21:45:34
【问题描述】:

假设,在AWS docs 之后,我想使用类似的卸载命令

unload
(
'SELECT * 
FROM table_name 
WHERE day = '2019-01-01' 
')
to 's3://bucket_name/path' 
iam_role 'arn:aws:iam::<aws acct num>:role/<redshift role>'
ADDQUOTES
ESCAPE
DELIMITER ','
GZIP
ALLOWOVERWRITE; 

问题是完整的查询应该被引用,并且在查询中写入字符串文字会在完整的查询(作为有效的 sql)完成之前转义字符串。如何在 AWS redshift 卸载语句中转义引号?

完全披露,我知道一种方法可以做到这一点,但没有看到一个好的链接或 SO 问题,所以我想我会发布一个让其他人受益的方法。

【问题讨论】:

  • “应该引用完整的查询”是什么意思?
  • @JohnRotenstein,我的意思是给出的示例中的第一个单引号(紧接在日期之前 => 2019-01-01 将在客户端提交后解析时转义字符串文字(例如 SQLWorkbench 和其他). 然后解析查询是无效的 SQL (在这种情况下是 SELECT * FROM table_name WHERE day = 所以你需要转义日期周围的单引号 (或任何其他字符串文字) 以获得有效的 SQL 语句. 是否这有意义吗?

标签: sql amazon-web-services amazon-redshift


【解决方案1】:

您可以将查询放在 $$ 符号之间,这样您就不必担心任何类型的引号

unload
(
$$SELECT * 
FROM table_name 
WHERE day = '2019-01-01' 
$$)
to 's3://bucket_name/path' 
iam_role 'arn:aws:iam::<aws acct num>:role/<redshift role>'
ADDQUOTES
ESCAPE
DELIMITER ','
GZIP
ALLOWOVERWRITE; 

【讨论】:

    【解决方案2】:

    来自UNLOAD - Amazon Redshift

    如果您的查询包含引号(例如将文字值括起来),请将文字放在两组单引号之间——您还必须将查询括在单引号之间:

    ('select * from venue where venuestate=''NV''')

    【讨论】:

    • 这很有趣,我上次阅读时错过了。我在纽约的办公室使用 SQLWorkbench 客户端。对我有用的另一种方法是用反斜杠转义单引号。例如``` unload ('select * from avenue where avenuestate=\'NV\' ') ``` 上周对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2021-12-22
    • 1970-01-01
    • 2018-03-19
    • 2013-08-29
    • 2020-10-24
    相关资源
    最近更新 更多