如何处理 AWS Redshift 卸载命令中的引用值?

Posted

技术标签:

【中文标题】如何处理 AWS Redshift 卸载命令中的引用值?【英文标题】:How to handle quoted values in AWS Redshift unload command? 【发布时间】: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 语句. 是否这有意义吗? 【参考方案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\' ') ``` 上周对我有用。

以上是关于如何处理 AWS Redshift 卸载命令中的引用值?的主要内容,如果未能解决你的问题,请参考以下文章

Coalesce 函数如何处理数据类型

如何处理 AWS 中的开发和生产环境? [关闭]

如何处理 aws-appsync 中的关系?

如何处理 AWS 中的大型 WAR 文件?

AWS postgres RDS 读取复制如何处理架构切换?

如何使用 aws unload 命令将数据从 AWS Redshift 卸载到 s3?