ストレージ形式の変換 - Teradata Database - Teradata Vantage NewSQL Engine - JSONストレージ形式を別のストレージ形式に変換します。

Teradata Vantage™ JSONデータ型

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Published
2019年3月
Language
日本語
Last Update
2019-10-29
dita:mapPath
ja-JP/bgi1512081870828.ditamap
dita:ditavalPath
ja-JP/bgi1512081870828.ditaval
dita:id
evi1472243742653
Product Category
Software
Teradata Vantage

特定の格納形式(テキスト、BSON、またはUBJSON)でJSONデータを格納するように定義されているテーブルの列で、その他の格納形式のJSONデータを受け取ることができます。Teradata Databaseは、データを格納する前に格納先の列の格納形式に自動的に変換します。

データは次のルールに基づいて変換されます。
ストレージ形式の変換 説明
BSONからテキスト

BSONデータが列の文字セットに変換されます。BSONの文字列はUTF8で格納されるので、ターゲットの文字セットのレパートリーに存在しない文字がデータに含まれる場合は変換エラーが報告されます。

BSONには、ベースのJSONデータ型(バイナリ データや日付など)の拡張機能が含まれています。これらの拡張データ型は、結果として得られるJSONテキスト文書の文字列として扱われます。

UBJSONからテキスト UBJSONデータが列の文字セットに変換されます。UBJSONの文字列はUTF8で格納されるので、ターゲットの文字セットのレパートリーに存在しない文字がデータに含まれる場合は変換エラーが報告されます。
テキストからBSON JSONテキスト データがBSON形式に変換されます。ソースのJSONテキストがLATIN文字セットでも、すべての文字列がUTF8でエンコードされます。結果として得られるBSON文書では、拡張データ型は使用されません。
UBJSONからBSON UBJSONデータはBSON形式に変換されます。結果として得られるBSON文書では、拡張データ型は使用されません。
テキストからUBJSON JSONテキスト データがUBJSON形式に変換されます。ソースのJSONテキストがLATIN文字セットでも、すべての文字列がUTF8でエンコードされます。
BSONからUBJSON BSONデータがUBJSON形式に変換されます。BSONには、ベースのJSONデータ型(バイナリ データや日付など)の拡張機能が含まれています。これらの拡張データ型は、結果として得られるUBJSON文書の文字列として扱われます。

BSONに関する変換

BSON文書の一部のデータが拡張データ型形式のいずれかで、ターゲットの形式でこのデータがサポートされていない場合は、BSONから変換するとデータが二重引用符で囲まれます。

BSONに変換する場合、ソースの形式に拡張データ型形式のデータは含まれません。Teradata Databaseは、二重引用符で囲まれたデータを拡張データ型のいずれかとして扱うかどうかを決定する解釈を行ないません。したがって、BSONに変換する場合はすべて、拡張データ型のデータを含まないBSON文書になります。

BSONとして格納する場合、JSON文書のルートは常にオブジェクトであると見なされます。さらに、配列は、キーが要素の配列インデックスであるキー/値ペアとして格納されます。

例えば、次のJSON文書について考えてみます。

[ "a" , "b" ]

BSONでは、文書は次のように格納されます。

{ "0" : "a" , "1" : "b" }

このBSON文書をテキストに変換すると、そのオブジェクトのような表現が表示されます。これは、文書のルートがオブジェクトであるというBSONの前提が原因です。これは、BSON仕様の制限です。入れ子の配列は同じように表わされますが、データが配列を表わすことを意味するインジケータ バイトが後に続くので、この制限を受けることはありません。したがって、JSONテキストに戻すと、キー部分は出力されません。

次の文書について考えてみます。

{ "array" : [ "a" , "b" ] }

このテキストをBSONに変換し、その後テキストに戻した場合に、次のようにまったく同じ文書になるように、入れ子の配列は1つの配列として適切に扱われます。

{ "array" : [ "a" , "b" ] }

値を検索する場合、JSONPath問合わせは、配列またはオブジェクトのどちらでデータを格納しているかを変更しません。例えば、次の文書が配列またはオブジェクトとして格納されている場合を考えます。

[ "a" , "b" ]
{ "0" : "a" , "1" : "b" }

これらの文書で値"a"を検索すると、両方の文書で次の問合わせが成功します。

SELECT jsonCol[0] FROM jsonTable;

理由は、JSONPathが問合わせリクエストを正規化するためです。正規化には角括弧の削除が含まれるため、問合わせを評価するときに"0"というキーまたは配列のインデックス0の要素の検索が必要かどうかが分かりません。JSONPathでは、次の処理を行ないます。

  1. キーを検索します。
  2. 検索が失敗し、検索対象の値が正の整数で配列にある場合は、指定したインデックスで要素を探します。

したがって、検索するとどちらの場合でも"a"が返されます。

つまり、BSONデータを読み取り、そのデータをテキストに戻すときにのみ制限が適用されます。結果として得られるテキスト文書は少し異なる場合がありますが、同じ方法で検索できます。