You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理Redshift SUPER类型JSON路径中的美元符号($)?

Redshift SUPER类型提取含$特殊字符键值方案

核心原因

点号访问SUPER字段的语法仅支持无特殊字符的常规键名,带$的特殊键名不符合默认标识符规则,之前的写法错误集中在转义方式、引号类型使用不符合Redshift SUPER的语法规范;另外你尝试的PartiQL遍历无结果,是因为默认展开语法仅针对数组类型,对象结构直接遍历不会返回行。

验证可用的实现方案

方案1:双引号包裹键名(原生SUPER语法,性能最优)

访问带特殊字符的SUPER对象键名时,必须用双引号包裹键名,无需转义$符号,提取后可直接强转为VARCHAR类型:

SELECT properties."$os"::VARCHAR AS os_value FROM clean;

注意:此处不能使用单引号,也不需要添加反斜杠转义$,否则会被识别为其他键名/语法错误。

方案2:使用JSON路径提取函数(兼容通用JSON写法)

如果习惯通用JSON处理语法,可直接使用JSON_EXTRACT_PATH_TEXT函数,该函数直接支持带特殊字符的键名入参,返回结果直接是VARCHAR类型,无需额外强转:

SELECT JSON_EXTRACT_PATH_TEXT(properties, '$os') AS os_value FROM clean;

已尝试写法的错误说明

  • properties.'$os'、properties.'\$os':SUPER字段属性访问不支持单引号包裹键名,单引号包裹的内容会被识别为字符串常量,而非键名标识符
  • properties[$os]:中括号语法内未加引号的内容会被识别为列/变量引用,不会被当做字面量键名解析
  • properties['\$os']:中括号内的键名需要使用双引号,额外添加的反斜杠转义会让引擎查找名为\$os的键,匹配不到目标值
  • from base b, b.properties pr遍历无结果:该写法是对SUPER数组做unnest展开,你的properties字段是对象结构而非数组,自然无返回;如果需要遍历对象键值,需要先用OBJECT_PAIRS函数把对象转为键值对数组再展开,参考写法:
    SELECT b.user_id, pr.key, pr.value
    FROM base b, OBJECT_PAIRS(b.properties) pr;
    
  • properties[0]类下标访问返回null:下标访问仅对SUPER数组生效,对象类型使用数字下标访问无对应值,固定返回null。

内容的提问来源于stack exchange,提问作者thleo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:12:35