如何处理 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 卸载命令中的引用值?的主要内容,如果未能解决你的问题,请参考以下文章