aws_s3.query_export_to_s3执行复杂PGSQL查询因单引号报错求助
问题
按照AWS文档配置PostgreSQL的CSV导出功能后,使用简单查询调用aws_s3.query_export_to_s3函数可正常运行,但替换为包含单引号的复杂查询时,会在单引号位置抛出语法错误。
正常运行的示例代码
SELECT * from aws_s3.query_export_to_s3('select * from sample_table', aws_commons.create_s3_uri('s3_bucket', '/path/filename'))
报错的复杂查询示例
select dev.integer, 'Feburary', EXTRACT('DAY' from dev.integration_eed), te.timber_upperclass, count(*) from uer_auth ua, team_id gm where ua.id = gm.user_id and gm.group_id in (select id from groups where org_id not in (select id from fi)) and dev.integration_eed >= '2023-02-01 00:00:00' and dev.integration_eed < '2023-03-01 00:00:00' group by dev.integer, EXTRACT('DAY' from dev.integration_eed), te.timber_upperclass;
错误信息
ERROR: syntax error at or near "Feburary" LINE 1: ...from aws_s3.query_export_to_s3('select ua.scope, 'Feburary',...
原因与解决办法
这不是函数不接受内部单引号,而是字符串嵌套时的单引号转义问题:
你把查询语句用单引号包裹作为aws_s3.query_export_to_s3的第一个参数,而查询语句内部本身也有单引号(比如'Feburary'、'DAY'),这会导致PostgreSQL解析时提前截断字符串,把'Feburary'的第一个单引号当成外层字符串的结束符,从而引发语法错误。
解决方法有两种:
- 转义内部单引号:把查询语句里的每个单引号替换成两个单引号(
''),这是PostgreSQL中转义字符串内单引号的标准方式。
修改后的调用示例:SELECT * from aws_s3.query_export_to_s3('select dev.integer, ''Feburary'', EXTRACT(''DAY'' from dev.integration_eed), te.timber_upperclass, count(*) from uer_auth ua, team_id gm where ua.id = gm.user_id and gm.group_id in (select id from groups where org_id not in (select id from fi)) and dev.integration_eed >= ''2023-02-01 00:00:00'' and dev.integration_eed < ''2023-03-01 00:00:00'' group by dev.integer, EXTRACT(''DAY'' from dev.integration_eed), te.timber_upperclass;', aws_commons.create_s3_uri('s3_bucket', '/path/filename')) - 使用美元引号(Dollar Quoting):用
$$包裹查询语句,避免手动转义单引号,这是更简洁的方式,尤其适合复杂查询。
修改后的调用示例:SELECT * from aws_s3.query_export_to_s3($$select dev.integer, 'Feburary', EXTRACT('DAY' from dev.integration_eed), te.timber_upperclass, count(*) from uer_auth ua, team_id gm where ua.id = gm.user_id and gm.group_id in (select id from groups where org_id not in (select id from fi)) and dev.integration_eed >= '2023-02-01 00:00:00' and dev.integration_eed < '2023-03-01 00:00:00' group by dev.integer, EXTRACT('DAY' from dev.integration_eed), te.timber_upperclass;$$, aws_commons.create_s3_uri('s3_bucket', '/path/filename'))
内容的提问来源于stack exchange,提问作者devops_dummy
相关产品推荐
相关产品推荐

