在我的 PL/SQL 代碼中,我收到了一個 JSON 陣列:
[
{"name": "Tony", "age": "20", "city": "Bigville"},
{"name": "Lucas", "age": "40", "city": "Smallville"},
{"name": "Mike", "age": "40", "city": "Otherville"}
]
然后我使用這段代碼來生成一個這樣的物件{"Tony": "20", "Lucas": "40"}:
select json_objectagg(key "name" value "age") into v_patch
from(
with t(dta) as ( select json_query(:data, '$') from dual )
select "name", "age" from t
cross join json_table(dta,
'$' columns(nested path '$[*]'
columns(
"name" varchar2(1024) path '$.name',
"age" varchar2(1024) path '$.age'
)
)
)
);
如何過濾上面的陣列,以便只將 Bigville 或 Smallville 的人添加到最終物件中?
uj5u.com熱心網友回復:
如果您不想太多更改代碼,只需在 JSON 路徑中添加過濾器即可:
select json_objectagg(key "name" value "age") into v_patch
from(
with t(dta) as ( select json_query(:data, '$') from dual )
select "name", "age" from t
cross join json_table(dta,
'$' columns(nested path '$[*]?(@.city in ("Bigville","Smallville"))'
columns(
"name" varchar2(1024) path '$.name',
"age" varchar2(1024) path '$.age'
)
)
)
);
uj5u.com熱心網友回復:
您的資料中有幾個奇怪的地方:Tony 沒有"age"鑰匙,但他有" age"(帶前導空格);希望這只是一個錯字。并且“年齡”應該是數字,而不是字串;JSON 支持數字資料型別,為什么不使用它?
您現有代碼中的一些奇怪之處:無需json_query像您一樣使用,直接json_table接受字串輸入(clob、varchar2)。并且不需要nested path子句 - 您的資料中沒有嵌套物件。
輸出中的一個奇怪之處:“名稱”都是“同類”物體,那么為什么它們會成為輸出物件的不同屬性?要求 json 陣列作為輸出似乎更自然。如果我們能夠理解您為什么這樣做,這將對我們有所幫助。順便說一句,如果有兩個或更多人的名字相同,您將創建一個具有重復鍵的物件;您了解可能導致哪些問題嗎?
修復所有這些不同的事情,您的查詢可以調整 - 并簡化 - 如下:
select json_objectagg(key "name" value "age") into v_patch
from json_table(:data, '$[*]?(@.city in ("Bigville", "Smallville"))'
columns( "name" varchar2 path '$.name',
"age" varchar2 path '$.age' )
)
;
請注意,早期版本(12.1、12.2)不支持帶有謂詞的路徑運算式(如按城市過濾)。最壞的情況是,您也可以從輸入資料中提取城市,并使用whereastenix 的答案中所示的子句。
uj5u.com熱心網友回復:
您可以添加city列作為輸出并使用通用where子句來限制 by city。
with a as ( select q'([ {"name": "Tony", "age": "20", "city": "Bigville"}, {"name": "Lucas", "age": "40", "city": "Smallville"}, {"name": "Mike", "age": "40", "city": "Otherville"} ])' as j from dual ) select json_objectagg( key js.name value js.age ) as res from a cross join json_table( a.j , '$[*]' columns ( name varchar2(10) , age int , city varchar2(20) ) ) js where js.city in ('Bigville', 'Smallville')
| 資源 |
| :------------------------- |
| {“托尼”:20,“盧卡斯”:40} |
db<>在這里擺弄
另請注意,帶引號的識別符號區分大小寫,如果可能,不應使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/359694.html
