在 oracle sql 中拆分给定的列

Split the given column in oracle sql

我要拆分以下table

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

我想使用 oracle sql

来关注 table
senderName senderCountry senderAddress
John David LKA No 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

但我得到了以下 table

senderName senderCountry senderAddress
"senderName" "John David", "senderCountry" "LKA", "senderAddress"

谁能帮帮我?

谢谢

如果您使用的是 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

这会产生以下结果:

SENDERNAME SENDERCOUNTRY SENDERADDRESS
John David LKA No 230,ABS,11200

这里是一个 DBFiddle 显示这个工作 (Link)

为此你应该使用 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 无效,因为它缺少结束符 "

输出:

SENDERNAME SENDERCOUNTRY SENDERADDRESS
John David LKA No 230,ABS,11200
Jane Smith ABC No 42,"Home", XYZ, 98765

db<>fiddle here

"

拆分更容易
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