JSON 值 - Oracle PL/SQL:多个字段

JSON Value - Oracle PL/SQL : Multiple Fields

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

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

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

是否有任何变通方法来获得两个操作值?

此致。

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}]}'
);

输出:

NAME | FLAG  | ACTION            
:--- | :---- | :-----------------
XYZ  | false | Manager           
XYZ  | false | Specific User List

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

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

输出:

NAME | FLAG  | ACTION1 | ACTION2           
:--- | :---- | :------ | :-----------------
XYZ  | false | Manager | Specific User List

db<>fiddle here

"action" 的值是一个 JSON 数组。您接受了一个答案,即 returns 来自该数组的标量值,而不是数组本身(作为单个复合值)。无论这是否真的是您的要求(换句话说:您是否错误陈述了您的问题),您可以按照以下方式回答问题完全按照您的陈述 .

如您正确理解的那样,JSON_VALUE() 只有 JSON 文档中的 returns 标量值。对于returnJSON片段,可以使用JSON_QUERY(),语法基本相同。

至 return JSON 数组,即文档中 "action" 的值(使用 MT0 的 table):

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

ACTION                              
------------------------------------
["Manager","Specific User List"]