[英]ORACLE JSON_TABLE I need to get 2 columns from an array
我有這個 SQL 代碼
SELECT * FROM JSON_TABLE (('
[
"tipodenunciaid": [1,2],
"municipioid": [1,2]
]
'), '$[*]' COLUMNS (tipodenunciaid integer PATH '$.tipodenunciaid[*]', municipioid integer PATH '$.municipioid[*]'));
我想得到下一個結果:
我的查詢有什么問題?
太感謝了。
你不能這樣使用json_table()
。 如果您希望 arrays 都未嵌套在不同的列中,並根據每個數組中每個元素的 position 排列,那么一個選項是將每個數組單獨擴展為行,使用ordinality
來跟蹤每個元素的 Z4757FE07FD492A8BEEEZA6 然后加入兩個結果集。 full join
可以方便地容納每個數組中不相等數量的元素:
with
data as (
select '{ "tipodenunciaid": [1,2,3,4], "municipioid": [1,2,3,4,5] }' as js from dual
),
t as (
select t.*
from data d
cross apply json_table(
d.js,
'$.tipodenunciaid[*]' columns (rn for ordinality, tipodenunciaid integer path '$')
) t
),
m as (
select m.*
from data d
cross apply json_table(
d.js,
'$.municipioid[*]' columns (rn for ordinality, municipioid integer path '$')
) m
)
select t.tipodenunciaid, m.municipioid
from t
full join m on m.rn = t.rn
您可以將兩個OUTER APPLY
與FOR ORDINALITY
一起使用來生成數組的縱坐標以將表連接到自身:
SELECT j.id,
CASE
WHEN t.id = m.id OR t.id > m.max_id OR m.id IS NULL
THEN tipodenunciaid
END AS tipodenunciaid,
CASE
WHEN t.id = m.id OR m.id > t.max_id OR t.id IS NULL
THEN municipioid
END AS municipioid
FROM table_name j
OUTER APPLY (
SELECT id,
tipodenunciaid,
MAX(id) OVER () AS max_id
FROM JSON_TABLE(
j.json,
'$.tipodenunciaid[*]'
COLUMNS (
id FOR ORDINALITY,
tipodenunciaid integer PATH '$'
)
)
) t
OUTER APPLY (
SELECT id,
municipioid,
MAX(id) OVER () AS max_id
FROM JSON_TABLE(
j.json,
'$.municipioid[*]'
COLUMNS (
id FOR ORDINALITY,
municipioid integer PATH '$'
)
)
) m
WHERE t.id = m.id
OR t.id IS NULL
OR ( m.id > t.max_id AND t.id = t.max_id )
OR m.id IS NULL
OR ( t.id > m.max_id AND m.id = m.max_id );
其中,對於樣本數據:
CREATE TABLE table_name ( id, json ) AS
SELECT 1, '{"tipodenunciaid":[1,2],"municipioid":[1,2]}' FROM DUAL UNION ALL
SELECT 2, '{"tipodenunciaid":[],"municipioid":[3,4]}' FROM DUAL UNION ALL
SELECT 3, '{"tipodenunciaid":[5],"municipioid":[]}' FROM DUAL UNION ALL
SELECT 4, '{"tipodenunciaid":[6,7],"municipioid":[6]}' FROM DUAL UNION ALL
SELECT 5, '{"tipodenunciaid":[8],"municipioid":[8,9]}' FROM DUAL;
輸出:
身份證 | TIPODENUNCIAID | MUNICIPIOID -: | -------------: | ----------: 1 | 1 | 1 1 | 2 | 2 2 | null | 3 2 | null | 4 3 | 5 | null 4 | 6 | 6 4 | 7 | null 5 | 8 | 8 5 | null | 9
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.