配列値の相互結合(rownum
でグループ化)が必要なようです およびname
)。これは標準のJSON構造ではないため、json_table
の単一のアプリケーションでこれを実行できると期待すべきではありません。 。
json_table
を2回呼び出すことでこれを行う1つの方法があります 。最初の呼び出しでは、ネストされたパスを使用して名前だけを取得しますが、それでもアドレス配列は保持します。 2回目の呼び出しでは、最初の呼び出しで生成された行ごとに個別にアドレスを解凍します。
外側のselect
でオプティマイザーヒントが使用されていることに注意してください 。これがないと、オプティマイザーは横方向の結合の不正な「ネスト解除」を試みるため、これが必要になります(outer apply
)クエリをそのままにするのではなく、エラーをスローします。 (これはオプティマイザーの非常に一般的で迷惑な習慣です。無効なものを試行し、それについて文句を言います。)
また、rownum
は予約済みのキーワードです。出力の列名として使用することはできません。 (技術的には、追加の作業で可能ですが、できないと信じるのが最善です。)
with
t as (
select *
from json_Table(
'{
"Rownum": "1",
"Name": "John",
"AddressArray":["Address1", "Address2"],
"TextObj":[{"mName" : "Carol","lName" : "Cena"},
{"mName" : "Mark","lName" : "Karlo"}
]
}',
'$' columns (
rownr number path '$.Rownum',
name varchar2(100) path '$.Name',
addressArray varchar2(4000) format json path '$.AddressArray',
nested path '$.TextObj[*]'
columns (mName varchar2(100) path '$.mName',
lName varchar2(100) path '$.lName'
)
)
)
)
select /*+ no_query_transformation */ rownr, name, mname, lname, address
from t
outer apply
json_table (t.addressArray, '$[*]'
columns (address varchar2(10) path '$')
)
;
出力:
ROWNR NAME MNAME LNAME ADDRESS
----- ------ ------ ------ ----------
1 John Carol Cena Address1
1 John Carol Cena Address2
1 John Mark Karlo Address1
1 John Mark Karlo Address2