在oracle sql中分割给定的列



我想分割下面的表

{" sendname ";John David"; sendcountry ";LKA"; sendaddress"; "No 230,ABS,11200}

您应该使用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是无效的,因为它缺少关闭"

输出:

tbody> <<tr>
sendnamesendcountrysendaddress
约翰大卫党的没有230,ABS, 11200
简·史密斯ABC没有42,"Home", XYZ 98765

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

这会产生以下结果:

tbody> <<tr>
sendnamesendcountrysendaddress
约翰大卫党的没有230,ABS, 11200

使用"更容易分割

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

相关内容

  • 没有找到相关文章

最新更新