Oracle 从 JSON 数组中选择
Posted
技术标签:
【中文标题】Oracle 从 JSON 数组中选择【英文标题】:Oracle Select From JSON Array 【发布时间】:2021-01-24 20:31:07 【问题描述】:我有一个用于一些“设置”的表,在该表中我有一个带有 json 数组的记录。这是一个简单的数组,如下所示:
"['scenario1','scenario2','scenario3']"
我想在视图中使用子选择语句来提取此信息,以便我可以像这样使用它:
select * from table where field_scenario in (select ????? from settings_table where this=that)
我一直在查看文档并为此进行谷歌搜索,但对于我的一生,我无法弄清楚如何将返回的数组“旋转”成单个元素以便使用它。
Oracle 12c 我相信,在此先感谢。
【问题讨论】:
"['scenario1','scenario2','scenario3']"
不是 JSON 数组;它是一个 JSON 字符串。 ['scenario1','scenario2','scenario3']
(不带引号)将是一个 JSON 数组(严格满足 the syntax 它应该是双引号,但大多数解析器是允许的,并且允许单引号和双引号)。
【参考方案1】:
不使用正则表达式解析 JSON。使用合适的 JSON 解析器:
select *
from table_name
where field_scenario in (
SELECT j.value
FROM settings_table s
OUTER APPLY (
SELECT value
FROM JSON_TABLE(
s.json,
'$[*]'
COLUMNS(
value VARCHAR2(50) PATH '$'
)
)
) j
)
其中,对于样本数据:
CREATE TABLE settings_table ( json CLOB CHECK ( json IS JSON ) );
INSERT INTO settings_table ( json ) VALUES ( '["scenario1","scenario2","scenario3"]');
INSERT INTO settings_table ( json ) VALUES ( '["scenario5"]');
INSERT INTO settings_table ( json ) VALUES ( '["scenario \"quoted\""]');
INSERT INTO settings_table ( json ) VALUES ( '["scenario2,scenario4"]');
CREATE TABLE table_name ( id, field_scenario ) AS
SELECT LEVEL, 'scenario'||LEVEL FROM DUAL CONNECT BY LEVEL <= 6 UNION ALL
SELECT 7, 'scenario "quoted"' FROM DUAL;
输出:
身份证 | FIELD_SCENARIO -: | :---------------- 1 |场景1 2 |场景2 3 |场景3 5 |情景5 7 | “引用”的场景
db小提琴here
【讨论】:
非常感谢,这很奏效。真的很感激。我没想到要提取这些信息需要如此复杂的查询,但我对 json 很陌生。 好的,我不想回到这里,但这在我最初的简单测试中效果很好。但是,当我将它烘焙到视图中时,我收到一个错误“没有更多数据可以从套接字读取”。我把这些线拿出来,把硬编码的数据放回去,它工作得很好。有什么想法吗?以上是关于Oracle 从 JSON 数组中选择的主要内容,如果未能解决你的问题,请参考以下文章