你应该使用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<>在这里摆弄