[英]Oracle Split Delimited String Into Rows
这里很艰难。 我们正在运行 11g,所以我们现在没有 JSON 支持。 我的目标是将分隔符上的 JSON 字符串拆分成行,然后过滤每一行。 这可能吗? 下面是一个例子:
{
"section_1": {
"section_publish": true,
"section_body": "<p style=\"text-align: justify;\">
},
"section_2": {
"section_publish": false,
"section_body": "<p style=\"text-align: justify;\">
},
"section_3": {
"section_publish": true,
"section_body": "<p style=\"text-align: justify;\">
}
}
所以,基本上我希望在 } 上拆分这些部分,然后,一旦这些部分在“section_publish”上的“行”过滤器中:true,然后过滤这些部分。
JSON 字符串保存在表中,因此这将是 SELECT 语句的一部分:
SELECT id, name.....
FROM json_table
WHERE {json result from above} LIKE '%string to compare%';
是否有意义? 这可以在 SQL 中完成吗?
下面的示例可能不适用于您可能拥有的所有 JSON 变体,但此查询确实适用于提供的示例 JSON。
WITH
json_test (json_val) AS (SELECT EMPTY_CLOB () || '{
"section_1": {
"section_publish": true,
"section_body": "<p style=\"text-align: justify;\">"
},
"section_2": {
"section_publish": false,
"section_body": "<p style=\"text-align: justify;\">"
},
"section_3": {
"section_publish": true,
"section_body": "<p style=\"text-align: justify;\">"
}
}' FROM DUAL),
json_split
AS
( SELECT TRIM ('"' FROM REGEXP_SUBSTR (json_val,
'".*"',
1,
1 + ((LEVEL - 1) * 3))) AS section,
TRIM (TRIM (',' FROM SUBSTR (REGEXP_SUBSTR (json_val,
'"section_publish".*',
1,
LEVEL),
19))) AS section_publish,
REPLACE (
TRIM ('"' FROM TRIM (TRIM (',' FROM SUBSTR (REGEXP_SUBSTR (json_val,
'"section_body".*',
1,
LEVEL),
16)))),
'\"',
'"') AS section_body
FROM json_test
CONNECT BY LEVEL < REGEXP_COUNT (json_val, '{'))
SELECT TO_CHAR (section) AS section,
TO_CHAR (section_publish) AS section_publish,
TO_CHAR (section_body) AS section_body
FROM json_split
WHERE TO_CHAR (section_publish) = 'true';
SECTION SECTION_PUBLISH SECTION_BODY
____________ __________________ ___________________________________
section_1 true <p style="text-align: justify;">
section_3 true <p style="text-align: justify;">
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.