22.1 JSON_TABLEの代替のSQL NESTED句
SELECT
句で、SQL/JSONファンクションjson_table
のかわりにNESTED
句を使用することがよくあります。これにより、問合せ式が単純化されることがあります。これには、JSON列がNULL
の場合、NULL
以外のリレーショナル列を含む行を含めるという利点もあります。
NESTED
句は、ANSI左外部結合でjson_table
を使用するためのショートカットです。つまり、この2つの問合せは等価です。
SELECT ...
FROM mytable NESTED jcol COLUMNS (...);
SELECT ...
FROM mytable t1 LEFT OUTER JOIN
json_table(t1.jcol COLUMNS (...)
ON 1=1;
json_table
で左外部結合を使用したり、NESTED
句を使用すると、選択結果に対応するJSON列データがない(つまり、JSON列がNULL
である)リレーショナル列を含む行を含めることができます。この2つの間の唯一のセマンティックの相違点は、NESTED
句を使用する場合、JSON列自体が結果に含まれないことです。
NESTED
句は、ネストした列の可能性を含め、json_table
と同じCOLUMNS
句を指定します。NESTED
を使用するメリットは、次のとおりです。
-
単純なドット表記法を使用している場合でも、表別名を指定する必要はありません。
-
JSON列が
JSON
型でない場合でも、is json
チェック制約を指定する必要はありません。(列がJSON
型でないかぎり、単純なドット表記を使用したjson_table
には制約が必要です。) -
LEFT OUTER JOIN
を指定する必要はありません。
NESTED
句の構文はより単純で、COLUMNS
句のすべての柔軟性が実現され、暗黙的な左外部結合が実行されます。例22-2に、これを示します。
例22-3に、単純なドット表記法によるNESTED
句の使用を示します。
例22-2 等価: SQL NESTEDとLEFT OUTER JOINを指定したJSON_TABLE
次の2つの問合せは同じです。1つは、明示的なLEFT OUTER JOIN
を指定したでSQL/JSONファンクションjson_table
を使用します。もう1つは、SQLのNESTED
句を使用します。
SELECT id, requestor, type, "number"
FROM j_purchaseorder LEFT OUTER JOIN
json_table(data
COLUMNS (Requestor,
NESTED ShippingInstructions.Phone[*]
COLUMNS (type, "number")))
ON 1=1);
SELECT id, requestor, type, "number"
FROM j_purchaseorder NESTED
data
COLUMNS (Requestor,
NESTED ShippingInstructions.Phone[*]
COLUMNS (type, "number"));
出力はどちらの場合でも同じです。
7C3A54B183056369E0536DE05A0A15E4 Alexis Bull Office 909-555-7307
7C3A54B183056369E0536DE05A0A15E4 Alexis Bull Mobile 415-555-1234
7C3A54B183066369E0536DE05A0A15E4 Sarah Bell
表j_purchaseorder
に、列id
およびrequestor
の値がNULL
以外で列data
の値がNULL
である行がある場合、その行はどちらのケースでも表示されます。一方、LEFT OUTER JOIN
が存在しない場合、json_table
のケースには表示されません。
例22-3 SQL NESTEDを使用したネスト配列の拡張
この例では、表j_purchaseorder
から列id
とdate_loaded
を、JSON列data
のフィールドShippingInstructions
の値においてネストされている、フィールドPhone
の配列要素とともに選択します。Phone
配列値は列type
およびnumber
として展開されます。
(列指定"number"
には、number
がSQLの予約語であるため二重引用符が必要です。)
SELECT *
FROM j_purchaseorder NESTED
data.ShippingInstructions.Phone[*]
COLUMNS (type, "number")
親トピック: SQL/JSONファンクションJSON_TABLE