📣新登場!TiDB Cloud BYOC、TiDB Cloud Filesystem、PostgreSQL-compatible TiDB Cloud Starter がパブリックプレビュー中。このページは自動翻訳されたものです。原文はこちらからご覧ください。

Variant



VARIANT は、NULL、BOOLEAN、NUMBER、STRING、ARRAY、OBJECT を含む任意の型の値を格納できます。また、内部の値は任意のレベルでネストした構造にできるため、さまざまなデータを柔軟に格納できます。VARIANT は JSON とも呼ばれます。詳細は JSON の Web サイト を参照してください。

以下は、TiDB Cloud Lake で Variant データを挿入およびクエリする例です。

テーブルを作成します。

CREATE TABLE customer_orders(id INT64, order_data VARIANT);

異なる型の値をテーブルに挿入します。

INSERT INTO customer_orders VALUES ( 1, '{"customer_id": 123, "order_id": 1001, "items": [{"name": "Shoes", "price": 59.99}, {"name": "T-shirt", "price": 19.99}]}' ), ( 2, '{"customer_id": 456, "order_id": 1002, "items": [{"name": "Backpack", "price": 79.99}, {"name": "Socks", "price": 4.99}]}' ), ( 3, '{"customer_id": 123, "order_id": 1003, "items": [{"name": "Shoes", "price": 59.99}, {"name": "Socks", "price": 4.99}]}' );

結果をクエリします。

SELECT * FROM customer_orders;

結果:

┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ order_data │ ├─────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ 1 │ {"customer_id":123,"items":[{"name":"Shoes","price":59.99},{"name":"T-shirt","price":19.99}],"order_id":1001} │ │ 2 │ {"customer_id":456,"items":[{"name":"Backpack","price":79.99},{"name":"Socks","price":4.99}],"order_id":1002} │ │ 3 │ {"customer_id":123,"items":[{"name":"Shoes","price":59.99},{"name":"Socks","price":4.99}],"order_id":1003} │ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

JSON 内の要素へのアクセス

インデックスによるアクセス

VARIANT 型には配列を含めることができ、この配列は多くのプログラミング言語と同様に 0 ベースです。配列内の各要素も VARIANT 型です。要素には、角括弧 を使用してインデックスでアクセスできます。

例

テーブルを作成します。

-- Create a table to store user hobbies CREATE TABLE user_hobbies(user_id INT64, hobbies VARIANT NULL);

サンプルデータをテーブルに挿入します。

INSERT INTO user_hobbies VALUES (1, '["Cooking", "Reading", "Cycling"]'), (2, '["Photography", "Travel", "Swimming"]');

各ユーザーの最初の趣味を取得します。

SELECT user_id, hobbies [0] AS first_hobby FROM user_hobbies;

結果:

┌─────────────────────────────────────┐ │ user_id │ first_hobby │ ├─────────────────┼───────────────────┤ │ 1 │ "Cooking" │ │ 2 │ "Photography" │ └─────────────────────────────────────┘

各ユーザーの 3 番目の趣味を取得します。

SELECT hobbies [2], count() AS third_hobby FROM user_hobbies GROUP BY hobbies [2];

結果:

┌─────────────────────────────────┐ │ hobbies[2] │ third_hobby │ ├───────────────────┼─────────────┤ │ "Swimming" │ 1 │ │ "Cycling" │ 1 │ └─────────────────────────────────┘

GROUP BY を使用して趣味を取得します。

SELECT hobbies [2], count() AS third_hobby FROM user_hobbies GROUP BY hobbies [2];

結果:

┌────────────┬─────────────┐ │ hobbies[2] │ third_hobby │ ├────────────┼─────────────┤ │ "Cycling" │ 1 │ │ "Swimming" │ 1 │ └────────────┴─────────────┘

フィールド名によるアクセス

VARIANT 型には、オブジェクトとして表現されるキーと値のペアを含めることができます。各キーは VARCHAR、各値は VARIANT です。これは、他のプログラミング言語における「辞書」、「ハッシュ」、「マップ」と同様に機能します。値には、角括弧 または コロン を使用してフィールド名でアクセスできます。また、2 階層目以降では ドット も使用できます(テーブルとカラム間のドット記法との混同を避けるため、1 階層目の名前表記としてドットは使用できません)。

例

VARIANT 型でユーザー設定を保存するテーブルを作成します。

CREATE TABLE user_preferences( user_id INT64, preferences VARIANT NULL, profile Tuple(name STRING, age INT) );

テーブルにサンプルデータを挿入します。

INSERT INTO user_preferences VALUES ( 1, '{"settings":{"color":"red", "fontSize":16, "theme":"dark"}}', ('Amy', 12) ), ( 2, '{"settings":{"color":"blue", "fontSize":14, "theme":"light"}}', ('Bob', 11) );

各ユーザーの希望する色を取得します。

SELECT preferences['settings']['color'], preferences['settings']:color, preferences['settings'].color, preferences:settings['color'], preferences:settings:color, preferences:settings.color FROM user_preferences;

結果:

┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ preferences['settings']['color'] │ preferences['settings']:color │ preferences['settings']:color │ preferences:settings['color'] │ preferences:settings:color │ preferences:settings:color │ ├──────────────────────────────────┼───────────────────────────────┼───────────────────────────────┼───────────────────────────────┼────────────────────────────┼────────────────────────────┤ │ "red" │ "red" │ "red" │ "red" │ "red" │ "red" │ │ "blue" │ "blue" │ "blue" │ "blue" │ "blue" │ "blue" │ └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

フィールド名は大文字と小文字が区別されることに注意してください。フィールド名にスペースや特殊文字が含まれる場合は、二重引用符で囲みます。

INSERT INTO user_preferences VALUES ( 3, '{"new settings":{"color":"red", "fontSize":16, "theme":"dark"}}', ('Cole', 13) ); -- Double-quote the field name "new settings" SELECT preferences:"new settings":color FROM user_preferences; ┌──────────────────────────────────┐ │ preferences:"new settings":color │ ├──────────────────────────────────┤ │ NULL │ │ NULL │ │ "red" │ └──────────────────────────────────┘ -- No results are returned when 'c' in 'color' is capitalized SELECT preferences:"new settings":Color FROM user_preferences; ┌──────────────────────────────────┐ │ preferences:"new settings":color │ │ Nullable(Variant) │ ├──────────────────────────────────┤ │ NULL │ │ NULL │ │ NULL │ └──────────────────────────────────┘

データ型変換

デフォルトでは、VARIANT カラムから取得された要素がそのまま返されます。返された要素を特定の型に変換するには、:: 演算子と対象のデータ型(例: expression::type)を追加します。

VARIANT カラムでユーザー設定を保存するテーブルを作成します。

CREATE TABLE user_pref(user_id INT64, pref VARIANT NULL);

テーブルにサンプルデータを挿入します。

INSERT INTO user_pref VALUES (1, parse_json('{"age": 25, "isPremium": "true", "lastActive": "2023-04-10"}')), (2, parse_json('{"age": 30, "isPremium": "false", "lastActive": "2023-03-15"}'));

age を INT64 に変換します。

SELECT user_id, pref:age::INT64 as age FROM user_pref;

結果:

┌─────────┬─────┐ │ user_id │ age │ ├─────────┼─────┤ │ 1 │ 25 │ │ 2 │ 30 │ └─────────┴─────┘

JSON 関数

Variant Functions を参照してください。

このページは役に立ちましたか?