Oracle 12c无需指定属性查询JSON全字段并统一转字符串的方法
该需求可以实现,根据你使用的Oracle 12c具体版本不同,有两种可用的实现方案:
方案1:Oracle 12cR2(12.2.0.1)及以上版本(推荐)
12cR2版本开始支持JSON_TABLE的通配符语法,不需要手动枚举JSON内的字段,就能自动匹配所有顶级键,同时支持统一转换数据类型:
SELECT jt.* FROM my_table, JSON_TABLE( my_json_col, '$' COLUMNS ( -- 自动识别所有顶级键,值统一转为VARCHAR2类型,按JSON标准序列化加双引号 * VARCHAR2(4000) FORMAT JSON ) ) jt WHERE "USER" = '83';
说明:如果不需要保留值外层的双引号,只需要去掉
FORMAT JSON修饰符即可,非字符串类型仍会自动转为纯字符串(比如布尔值false转为'false'、数字18转为'18')。
方案2:Oracle 12cR1(12.1.x)版本
12cR1原生不支持JSON_TABLE自动列匹配,需要通过动态SQL拼接实现:
- 先查询出JSON字段的所有顶级键:
SELECT DISTINCT json_value(jt.key, '$') AS json_key FROM my_table, JSON_TABLE( JSON_KEYS(my_json_col), '$[*]' COLUMNS (key PATH '$') ) jt WHERE "USER" = '83';
- 把查询得到的所有键拼接成
JSON_TABLE的COLUMNS子句,生成最终的查询语句即可,结构和你当前的参考写法一致,不需要手动逐个录入字段名。
两种方案针对你给出的示例JSON,都可以得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者user5507535
相关产品推荐
相关产品推荐

