我有一个带有以下示例条目的 HCLOB
"relist":[{"name":"XYZ","action":["Manager","Specific User List"],"flag":false}]
当我尝试使用 JSON_VALUE 获取名称或标志时,我能够获取它,因为它具有单个字段,但我想获取操作的值。我读到 JSON_VALUE 只支持 1 个条目。
是否有任何解决方法可以同时获得行动价值?
问候。
我有一个带有以下示例条目的 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}]}'
);
输出:
姓名 | 旗帜 | 行动 :--- | :---- | :----------------- 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<>在这里摆弄
的值"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"]