0

我有一个带有以下示例条目的 HCLOB

"relist":[{"name":"XYZ","action":["Manager","Specific User List"],"flag":false}]

当我尝试使用 JSON_VALUE 获取名称或标志时,我能够获取它,因为它具有单个字段,但我想获取操作的值。我读到 JSON_VALUE 只支持 1 个条目。

是否有任何解决方法可以同时获得行动价值?

问候。

4

2 回答 2

2

JSON_TABLE与嵌套路径一起使用:

SELECT j.*
FROM   table_name t
       CROSS APPLY JSON_TABLE(
         t.data,
         '$.relist[*]'
         COLUMNS (
           name VARCHAR2(20) PATH '$.name',
           flag VARCHAR2(5)  PATH '$.flag',
           NESTED PATH '$.action[*]' COLUMNS(
             action VARCHAR2(20) PATH '$'
           )
         )
       ) j

其中,对于样本数据:

CREATE TABLE table_name ( data CLOB CHECK ( data IS JSON ) );

INSERT INTO table_name ( data ) VALUES (
  '{"relist":[{"name":"XYZ","action":["Manager","Specific User List"],"flag":false}]}'
);

输出:

姓名 | 旗帜 | 行动            
:--- | :---- | :-----------------
XYZ | 假 | 经理           
XYZ | 假 | 特定用户列表

或者使用数组的索引来获取操作:

SELECT j.*
FROM   table_name t
       CROSS APPLY JSON_TABLE(
         t.data,
         '$.relist[*]'
         COLUMNS (
           name    VARCHAR2(20) PATH '$.name',
           flag    VARCHAR2(5)  PATH '$.flag',
           action1 VARCHAR2(20) PATH '$.action[0]',
           action2 VARCHAR2(20) PATH '$.action[1]'
         )
       ) j

哪个输出:

姓名 | 旗帜 | 行动1 | 行动2           
:--- | :---- | :-------- | :-----------------
XYZ | 假 | 经理 | 特定用户列表

db<>在这里摆弄

于 2020-12-09T11:05:53.183 回答
0

的值"action"是一个 JSON 数组。您接受了从该数组返回标量值的答案,而不是数组本身(作为单个复合值)。无论这是否真的是您的要求(换句话说:您是否错误地陈述了您的问题),以下是您如何完全按照您所说的那样回答问题。

正如您正确理解JSON_VALUE()的那样,仅从 JSON 文档返回标量值。要返回 JSON 片段,您可以使用JSON_QUERY(), 基本上具有相同的语法。

要返回 JSON 数组,它是"action"文档中的值(使用 MT0 的表):

select json_query(data, '$.relist.action') as action
from   table_name
;

ACTION                              
------------------------------------
["Manager","Specific User List"]
于 2021-02-21T07:07:30.007 回答