0

我想拆分下表

柱子
{"senderName":"John David", "senderCountry":"LKA", "senderAddress":"No 230,ABS,11200}

我想使用 oracle sql 获取下表

发件人名称 发件国 发件人地址
约翰大卫 LKA 没有 230,ABS,11200

我尝试了以下代码

SELECT
regexp_substr(column,'[^:]+', 1, 1) As senderName,
regexp_substr(column,'[^:]+', 1, 2) As senderCountry,
regexp_substr(column,'[^:]+', 1, 3) As senderAddress  
From table

但我得到了下表

发件人名称 发件国 发件人地址
“发件人名称” “约翰大卫”、“发件人国家” “LKA”、“发件人地址”

任何人都可以帮助我吗?

谢谢

4

3 回答 3

1

如果您使用的是 18c 或更高版本,则可以使用JSON_TABLE

WITH test_data (json) AS
(
  SELECT '{"senderName":"John David", "senderCountry":"LKA", "senderAddress":"No 230,ABS,11200"}' FROM DUAL
)
SELECT jt.*
FROM test_data td,
JSON_TABLE(td.json,
           '$'
           COLUMNS (senderName VARCHAR2(100) PATH '$.senderName',
                    senderCountry VARCHAR2(100) PATH '$.senderCountry',
                    senderAddress VARCHAR2(100) PATH '$.senderAddress')) jt

这会产生以下结果:

发件人名称 发件国 发件人地址
约翰大卫 LKA 没有 230,ABS,11200

这是一个显示此工作的 DBFiddle(链接

于 2021-08-19T06:09:14.777 回答
1

你应该使用JSON_TABLE这个。

如果你不能并且你的 JSON 非常简单(即键只会出现一次并且你没有复杂的解析路径),那么你可以使用正则表达式(但如果你可以使用适当的 JSON 解析器,例如JSON_TABLE):

SELECT REPLACE(
         REGEXP_SUBSTR(
           column_name,
           '"senderName":\s*"((\\"|[^"])*)"',
           1,
           1,
           NULL,
           1
         ),
         '\"',
         '"'
       ) AS senderName,
       REPLACE(
         REGEXP_SUBSTR(
           column_name,
           '"senderCountry":\s*"((\\"|[^"])*)"',
           1,
           1,
           NULL,
           1
         ),
         '\"',
         '"'
       ) AS senderCountry,
       REPLACE(
         REGEXP_SUBSTR(
           column_name,
           '"senderAddress":\s*"((\\"|[^"])*)"',
           1,
           1,
           NULL,
           1
         ),
         '\"',
         '"'
       ) AS senderAddress  
FROM   table_name;

其中,对于样本数据:

CREATE TABLE table_name (column_name CHECK (column_name iS JSON)) AS
SELECT '{"senderName":"John David", "senderCountry":"LKA", "senderAddress":"No 230,ABS,11200"}' FROM DUAL UNION ALL
SELECT '{"senderName":"Jane Smith", "senderAddress":"No 42,\"Home\", XYZ, 98765", "senderCountry":"ABC"}' FROM DUAL;

注意:您的 JSON 无效,因为它缺少结束".

输出:

发件人名称 发件国 发件人地址
约翰大卫 LKA 没有 230,ABS,11200
简·史密斯 美国广播公司 42号,“家”,XYZ,98765

db<>在这里摆弄

于 2021-08-19T08:57:36.693 回答
0

更容易分开"

with tab1 as (
select '{"senderName":"John David", "senderCountry":"LKA", "senderAddress":"No 230,ABS,11200"}' col from dual
)
select replace(regexp_substr(t1.col, '"[^"]+"',1, 2), '"', ''),
       replace(regexp_substr(t1.col, '"[^"]+"',1, 4), '"', ''),
       replace(regexp_substr(t1.col, '"[^"]+"',1, 6), '"', '')
  from tab1 t1
于 2021-08-19T09:02:50.183 回答