使用CTE过滤含t记录后解析JSON仍报错的技术问题
解决JSON解析报错及过滤条件错误问题
问题原因
你当前的CTE逻辑和需求完全相反:
- 需求是移除包含字符't'的记录,但CTE里用了
where data like '%t%',反而把那些存着无效JSON的记录(比如{test12})筛选了出来,这类数据不符合JSON规范,导致PARSE_JSON解析时抛出错误。 - 从示例数据能看到,含't'的
Data值都是格式错误的JSON(比如{test12}缺少键名的双引号、没有合法键值对结构),自然无法被正常解析。
修正后的查询语句
把CTE的过滤条件改为not like '%t%',先排除掉含't'的坏数据,再执行JSON解析和扁平化操作:
with tab as ( select * from table where data not like '%t%' -- 修正条件:移除含't'的记录 ) select b.value::string, a.* from tab a, lateral flatten(input => PARSE_JSON(a.data)) b;
额外提示
另外注意,你示例里剩余的Data值(比如{id: 13-43})也不是标准JSON格式(JSON要求键名必须用双引号,值如果是字符串也需要引号,13-43这种写法也不符合JSON值规范)。如果后续仍有解析问题,可能需要先将数据转换为标准JSON格式,比如用正则修正键名:
-- 简单修复键名引号的示例(可根据实际数据调整规则) PARSE_JSON(REGEXP_REPLACE(a.data, '([a-zA-Z0-9_]+):', '"\1":'))
内容的提问来源于stack exchange,提问作者0004
相关产品推荐
相关产品推荐

