使用regexp_substr匹配{}间内容报Missing }错误该如何解决
报错原因
- 在POSIX正则规则中,
{是表示重复次数量词的特殊起始字符(例如a{2,4}代表匹配a连续出现2到4次),你直接写\{时,部分数据库的正则解析器没有将其识别为字面量字符,反而认为你要定义量词表达式,但缺少对应的}闭合,因此抛出该错误。 - 你原写法中的
.*属于贪婪匹配,就算正则不报错,也会从第一个{一直匹配到整个字符串的最后一个},只能得到一个包含所有内容的结果,无法拆分出多个独立的JSON片段。
正确正则写法
匹配单个{}包裹内容的正则为 \\{[^}]*\\},规则说明:
- 双反斜杠
\\是SQL语句中的转义标识,用来告诉解析器后续的{、}是普通字面量字符,不是正则特殊符号 [^}]*匹配除}之外的任意字符0次或多次,天然避免了贪婪匹配跨}的问题,刚好可以匹配单个{}内的所有内容
拆分多JSON的SQL示例(以Oracle为例)
如果需要一次性拆分出字段内所有的JSON片段,可以用层级查询配合正则实现:
select regexp_substr(jsons_arrays,'\\{[^}]*\\}',1,level) as single_json from 你的表名 connect by level <= regexp_count(jsons_arrays,'\\{[^}]*\\}') and prior rowid = rowid and prior sys_guid() is not null;
其他数据库可对应调整递归逻辑,正则部分通用。
验证效果
用你提供的示例值{'a': '20', 'b': '30'}, {'b': '1'}, {'a': '112', 'b': '34'}测试,会依次返回3个独立的JSON片段,完全符合需求。
内容的提问来源于stack exchange,提问作者mrc
相关产品推荐
相关产品推荐

