如何处理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
相关产品推荐
相关产品推荐

