このページでは、Spanner で JSON を操作する方法について説明します。
JSON データ型は、JSON(JavaScript Object Notation)データを保持するために使用される半構造化データタイプです。JSON 形式の仕様については、RFC 7159 をご覧ください。
JSON は、スパースであるか、大まかに定義されているか、構造が変化しているデータのリレーショナル スキーマを補足するのに便利です。ただし、クエリ オプティマイザーはリレーショナル モデルに依存して、大規模なフィルタリング、結合、集計、並べ替えを効率的に行います。JSON を介したクエリでは、組み込みの最適化が少なくなり、パフォーマンスを検査および調整するためのアフォーダンスが少なくなります。
仕様
Spanner JSON 型は、入力 JSON ドキュメントの正規化表現を格納します。
- JSON は最大で 80 レベルまでネストできます。
- 空白文字は保持されません。
- コメントはサポートされません。コメント付きのトランザクションやクエリは失敗します。
- JSON オブジェクトのメンバーは辞書順に並べ替えられます。
- JSON 配列要素の順序は保持されます。
- 1 つの JSON オブジェクトに重複するキーがある場合、最初のキーだけが保持されます。
- プリミティブ型(文字列、ブール値、数値、null)は、その型と値を保持します。
- 文字列型の値はそのまま保持されます。
- 数値型の値は保持されますが、正規化プロセスの結果としてテキスト表現が変更される場合があります。たとえば、入力値 10000 は、正規化され 1e+4 で表現される場合があります。数値の保存セマンティクスは次のとおりです。
- [INT64_MIN, INT64_MAX] の範囲の符号付き整数は保持されます。
- [0, UINT64_MAX] の範囲の符号なし整数は保持されます。
- 精度を失うことなく文字列、double、文字列へのラウンドトリップが可能な double 値は保持されます。double 値をこのような方法でラウンドトリップできない場合、トランザクションまたはクエリは失敗します。
- たとえば、
SELECT JSON '2.2412421353246235436'
は失敗します。 - 実用的な回避策は、
JSON '2.2412421353246237'
を返すPARSE_JSON('2.2412421353246235436', wide_number_mode=>'round')
です。
- たとえば、
TO_JSON()
、JSON_OBJECT()
、JSON_ARRAY()
関数を使用して、SQL で JSON ドキュメントを作成します。これらの関数は、必要な引用符とエスケープ文字を実装します。
正規化されたドキュメントの最大許容サイズは 10 MB です。
null 値許容
JSON の null
値は SQL 非 NULL として扱われます。
次に例を示します。
SELECT (JSON '{"a":null}').a IS NULL; -- Returns FALSE
SELECT (JSON '{"a":null}').b IS NULL; -- Returns TRUE
SELECT JSON_QUERY(JSON '{"a":null}', "$.a"); -- Returns a JSON 'null'
SELECT JSON_QUERY(JSON '{"a":null}', "$.b"); -- Returns a SQL NULL
エンコード
JSON ドキュメントは UTF-8 でエンコードする必要があります。他の形式でエンコードされた JSON ドキュメントを含むトランザクションやクエリはエラーを返します。
JSON 列があるテーブルの作成
テーブルの作成時に JSON 列をテーブルに追加できます。JSON 型の値は null 値にできます。
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
VenueFeatures JSON,
DateOpened DATE,
) PRIMARY KEY(VenueId);
既存のテーブルへの JSON 列の追加と削除
既存のテーブルに JSON 列を追加することも、削除することもできます。
ALTER TABLE Venues ADD COLUMN VenueDetails JSON;
ALTER TABLE Venues DROP COLUMN VenueDetails;
次のサンプルでは、Spanner クライアント ライブラリを使用して、VenueDetails
という JSON
列を Venues
テーブルに追加する方法を示します。
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
JSON データの変更
次のサンプルでは、Spanner クライアント ライブラリを使用して JSON
データを更新する方法を示します。
C++
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
C#
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Go
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Java
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Node.js
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
PHP
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Python
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Ruby
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
JSON データのクエリ
次のサンプルでは、Spanner クライアント ライブラリを使用して、JSON
データにクエリを実行する方法を示します。
C++
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
C#
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Go
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Java
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Node.js
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
PHP
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Python
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Ruby
Spanner 用のクライアント ライブラリをインストールして使用する方法については、Spanner クライアント ライブラリをご覧ください。
Spanner への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
制限事項
- ORDER BY で JSON 列は使用できません。
- JSON 型の列はインデックス登録をサポートしません。ただし、JSON 要素からスカラー値を抽出する生成された列には、インデックスを作成できます。
下の例では、JSON 要素 VenueDetails
からスカラー値を抽出する生成された列 Details
に、インデックス VenueMisc
が作成されます。編集可能な json_path は、JSONPath 形式の STRING 値です。
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
DateOpened DATE,
VenueDetails JSON,
Details STRING(MAX) AS (JSON_VALUE(VenueDetails, json_path)) STORED
) PRIMARY KEY(VenueId);
CREATE INDEX VenueMisc ON Venues(Details);