16.20 - INSERT...JSON文を使用したJSONシュレッディング - Teradata Vantage NewSQL Engine

Teradata Vantage™ JSONデータ型

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
created_date
2019年3月
category
プログラミング リファレンス
featnum
B035-1150-162K-JPN

単純なシュレッディングの場合は、INSERT文を使用してJSONデータをテーブルにシュレッディングできます。例えば、次のJSONデータがあるとします。

{"pkey":123,"val":1234}
次のINSERT文を使用してこのデータをMyTableテーブルにシュレッディングす​​ることができます。
INSERT INTO MyTable JSON '{"pkey":123,"val":1234}';
JSON_TABLEテーブル演算子を使用してこのデータをシュレッディングす​​ることもできますが、SQLはINSERT文を使用するよりも複雑です。
INSERT INTO MyTable
SELECT pkey, val FROM JSON_Table (
    ON (SELECT 1, new JSON ('{"pkey":123,"val":1234}'))
    USING rowexpr('$')
    colexpr('[{"jsonpath" : "$.pkey", "type" : "INTEGER"},
              {"jsonpath" : "$.val", "type" : "INTEGER"}]')
) AS JT(dummy, pkey, val);

INSERT文を使用するもう1つの利点は、文字列リテラルであるJSONデータをシュレッディングするときに、この操作が単一AMP操作になることです。これによって、パフォーマンスを向上させることができます。

パラメータ化されたSQLの場合、INSERT...JSONはVARCHAR、CLOB、および外部JSONデータ型をサポートします。ただし、操作は2つのAMPプロセスとして処理されます。パフォーマンスを向上させるには、JSONリテラルを直接指定することをお勧めします。

INSERT...JSON文を使用したJSONデータのシュレッディングのルール

  • テキスト形式のJSONデータのみをシュレッディングできます。INSERT文を使用してBSONやUBJSONなどのバイナリ形式のJSONデータをシュレッディングすることはできません。
  • シュレッディングされたデータはVARCHAR形式で、暗黙的キャストを使用してVARCHARデータをターゲット テーブルの列形式に変換します。VARCHARデータをターゲットの列形式にキャストできない場合、挿入は失敗します。例えば、ターゲット列がVARBYTEの場合、JSONにはバイナリ データに対応するテキスト値がないため、NULL以外の値をVARBYTEにキャストすると失敗します。
  • INSERT文は、ルートにJSON OBJECTを持つJSONデータの単一行のみを処理します。つまり、JSONデータは最初の非空白文字を'{'として開始します。INSERT文を使用して複数行のデータを挿入することはできません。
  • ターゲット テーブルがLDIテーブルの場合、INSERT文はロード分離オプションをサポートします。
  • ターゲット テーブルはビューではなくテーブルでなければなりません。
  • 列名の一致には大文字と小文字の区別はありません。
  • 同じ列が複数回一致した場合は、最後に一致したデータが格納されます。
  • ターゲット テーブルのいずれかの列がNOT NULLで、JSON入力データにその列のデータが含まれていない場合は、以下のルールが適用されます。
    • ターゲット列にDEFAULT値がない場合は、エラーがスローされます。
    • ターゲット列にDEFAULT値があり、JSONデータが文字列リテラルの場合は、DEFAULT値がターゲット テーブルに挿入されます。
    • ターゲット列にDEFAULT値があり、INSERT...JSONがパラメータ化されたSQLを使用している場合、DEFAULT値は無視され、エラーがスローされます。これが、JSONリテラルを指定する方法がパラメータ化されたSQLを使用する方法よりも好ましいもう1つの理由です。

INSERT...JSON文の詳細については、<Teradata Vantage™ SQLデータ操作言語、B035-1146>の「INSERT/INSERT … SELECT」を参照してください。