RStudio连接Redshift时WHERE子句字符串被识别为列名问题
解决方案:Redshift SQL筛选字符串值的引号问题
问题根源
Amazon Redshift(基于PostgreSQL)的语法规则明确:
- 双引号
"":仅用于包裹带空格、特殊字符或大小写敏感的标识符(比如列名"employee number") - 单引号
'':用于表示字符串常量(比如离职原因'Retirement')
你之前的错误是把字符串值用双引号包裹,或者完全不加引号,Redshift会把Retirement识别成列名,因此抛出column "retirement" does not exist的错误。
可行的R代码写法
写法1:外层单引号,内层字符串值用双单引号转义
R中,单引号包裹的字符串里,单引号需要写成两个单引号来完成转义:
leavers <- dbGetQuery(con, 'select distinct "employee number", "leaving reason" from leaverstable where "leaving reason" = ''Retirement''')
写法2:外层双引号,列名用反斜杠转义双引号
如果用双引号包裹整个SQL语句,列名里的双引号需要加反斜杠\转义,避免R解析错误:
leavers <- dbGetQuery(con, "select distinct \"employee number\", \"leaving reason\" from leaverstable where \"leaving reason\" = 'Retirement'")
写法3:参数化查询(推荐)
用DBI的参数化查询可以彻底避免引号转义问题,还能防止SQL注入风险:
leavers <- dbGetQuery(con, 'select distinct "employee number", "leaving reason" from leaverstable where "leaving reason" = $1', params = list("Retirement"))
补充说明
- 你之前调换引号后首个示例无法运行,是因为未正确转义内层的双引号,R会把未转义的双引号当成字符串结束符,导致语法错误。
- 参数化查询是最稳妥的方式,尤其处理动态筛选值时,既不用纠结引号规则,也能提升代码安全性。
内容的提问来源于stack exchange,提问作者Reader 123
相关产品推荐
相关产品推荐

