【问题标题】:How to get a part of JSON string in Oracle如何在 Oracle 中获取 JSON 字符串的一部分
【发布时间】:2021-01-07 22:50:30
【问题描述】:

我有来自字段的类似数据 ->

{"AddressLine1":"Example Dr","AddressLine2":"","City":"Paradise City","State":"State Name","PostalCode":"12345","Zip5": "67891","Zip4":""}

{"AddressLine1":"Ex Ln","AddressLine2":"Adr 22","City":"","State":"State Name","PostalCode":"12345","Zip5": "67891","Zip4":""}

我需要提取 "City": 旁边引号中的值。在上述情况下,我需要值 - Paradise CityNULL

【问题讨论】:

  • 这看起来几乎像 JSON;您无法以正确的 JSON 格式接收此数据的任何原因? Oracle 对 JSON 提供了出色的支持 - 这样您就不必重新发明轮子了。
  • 我们从另一个源系统获取这些数据。我们需要按原样处理这些数据并从中提取值
  • 您的 JSON 无效,因为 AddressLIne1 之前缺少双引号。

标签: json oracle


【解决方案1】:

您可以使用JSON_TABLE

SELECT t.id,
       jt.*
FROM   table_name t
       OUTER APPLY JSON_TABLE(
         t.value,
         '$'
         ERROR ON ERROR
         COLUMNS (
           AddressLine1 VARCHAR2(200) PATH '$.AddressLine1',
           AddressLine2 VARCHAR2(200) PATH '$.AddressLine2',
           City         VARCHAR2(200) PATH '$.City',
           State        VARCHAR2(200) PATH '$.State',
           PostalCode   VARCHAR2(7)   PATH '$.PostalCode',
           Zip5         VARCHAR2(5)   PATH '$.Zip5',
           Zip4         VARCHAR2(4)   PATH '$.Zip4'
         )
       ) jt;

其中,对于样本数据:

CREATE TABLE table_name ( id INT, value CLOB CHECK ( value IS JSON ) );

INSERT INTO table_name ( id, value )
SELECT 1, '{"AddressLine1":"Example Dr","AddressLine2":"","City":"Paradise City","State":"State Name","PostalCode":"12345","Zip5":"67891","Zip4":""}' FROM DUAL UNION ALL
SELECT 2, '{"AddressLine1":"Ex Ln","AddressLine2":"Adr 22","City":"","State":"State Name","PostalCode":"12345","Zip5":"67891","Zip4":""}' FROM DUAL UNION ALL
SELECT 3, NULL FROM DUAL;

输出:

身份证 |地址1 |地址2 |城市 |状态 |邮政编码 |邮编5 |邮编4 -: | :----------- | :----------- | :------------ | :--------- | :--------- | :---- | :--- 1 |示例博士 | |天堂城 |州名 | 12345 | 67891 | 2 |前 Ln |地址 22 | |州名 | 12345 | 67891 | 3 | | | | | | |

db小提琴here

【讨论】:

  • 有没有办法改进这个查询,即使json字符串字段中有空值,我也可以从主表中获取其他列?
  • @Shru 是的,只需将它们添加到SELECT 子句中即可。
  • 这正是我所做的,但我注意到查询正在过滤掉所有在携带 json 字符串的字段中具有空值的行。我的要求是从主表中取出所有行,而不管 json 字符串是否存在。
  • @Shru 啊,误解了你在问什么。将CROSS APPLY 更改为OUTER APPLY
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 2014-09-13
  • 2012-07-23
  • 2016-06-13
相关资源
最近更新 更多