単純なシュレッディングの場合は、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」を参照してください。