在 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
我要拆分以下table
column |
---|
{"senderName":"John David", "senderCountry":"LKA", "senderAddress":"No 230,ABS,11200} |
我想使用 oracle sql
来关注 tablesenderName | 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