{" 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> sendname sendcountry sendaddress 约翰大卫 党的 没有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> sendname sendcountry sendaddress 约翰大卫 党的 没有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