我有一個這樣的 JSON(請參閱下面的測驗設定)
{
"dt" :
[
{
"values" :
[
{
"key" : "a"
},
{
"key" : "b"
}
]
}
]
}
并且直接決議內部陣列,因為它具有如下鍵
SELECT tab.id,
jt.*
FROM parse_json_array tab,
json_table(data, '$.dt[*]'
COLUMNS (NESTED PATH '$.values[*]' COLUMNS(
key PATH '$.key' )
)) AS "JT"
where tab.id = 1;
回傳
ID, KEY
--------
1 a
1 b
但是如果內部陣列沒有鍵,我怎么能添加路徑NESTED PATH?
{
"dt" :
[
{
"values" :
[
"a",
"b"
]
}
]
}
我所有的嘗試,例如key PATH '$.*'或key PATH '*'回傳null或語法錯誤。
請注意,我不需要決議兩種變體的解決方案,但這當然是一個獎勵;)
我在 XE 18.4.0.0.0
測驗資料
create table parse_json_array
(id int primary key,
data CLOB constraint c1 check(data is JSON)
);
insert into parse_json_array (id, data) values (1, '{ "dt" : [ {"values" : [{"key" : "a"} , {"key" : "b" } ]} ] }');
insert into parse_json_array (id, data) values (2, '{ "dt" : [ {"values" : [ "a" , "b" ]}] }');
uj5u.com熱心網友回復:
這將為您提供id嵌套陣列中的和 值,當它只是一個標量陣列而不是物件時。
SELECT tab.id,
jt.*
FROM parse_json_array tab,
json_table(data, '$.dt[*].values[*]'
COLUMNS key PATH '$' )
AS "JT"
where tab.id = 2;
以兩種格式存盤 JSON,更重要的是,尋求一種對這兩種格式都適用的解決方案沒有多大意義;JSON 結構不同。這就像請求一個 SQL SELECT 查詢,該查詢適用于具有不同列集的兩個不同表。
如果您需要具有嵌套路徑的解決方案(可能是因為您必須挑選出您沒有與我們共享的其他資料位),您可以執行以下操作(這是 Padders 在評論中建議的內容):
SELECT tab.id,
jt.*
FROM parse_json_array tab,
json_table(data, '$.dt[*]' columns(
nested path '$.values[*]'
COLUMNS (key PATH '$' )) )
AS "JT"
where tab.id = 2;
編輯:
要從物件成員和嵌套陣列的標量成員中獲取值,您可以執行以下操作。使用nvl(k_token, token),如果你只需要值,并不需要知道它來自物件陣列或標量的陣列。請注意,即使您將物件和標量混合在同一個JSON 中(在同一個嵌套陣列中),此解決方案也將起作用。
select p.id, j.k_token, j.token
from parse_json_array p,
json_table(data, '$.dt[*].values[*]'
columns( k_token path '$.key',
token path '$'
)
) j
;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/373091.html
