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 数组中选择的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE JSON_TABLE 我需要从数组中获取 2 列

从 Oracle 表变量/数组中选择值?

使用swift 3从json数组中选择特定元素

使用 jq 从多维 JSON 数组中选择第 n 个元素

jq 从数组中选择值,其中 json 没有任何根元素

从 S3 读取大型 JSON 文件 (3K+) 并从数组中选择特定键