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"]
我有一个包含以下示例条目的 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"]