- カテゴリ:
半構造化データ関数と構造化データ関数 (解析)
PARSE_JSON¶
入力文字列を JSON ドキュメントとして解釈し、 VARIANT 値を生成します。
JSON 形式の入力データがある場合、 PARSE_JSON 関数を使用できます。この関数は、 JSON 形式からのデータを ARRAY または OBJECT のデータに変換し、そのデータを VARIANT 値で直接保管できます。その後、データを分析または操作できます。
デフォルトでは、この関数は JSON オブジェクトのキーの重複を許可しませんが、 'parameter' 引数を設定してキーの重複を許可することができます。
- こちらもご参照ください。
構文¶
引数¶
必須:
expr有効な JSON 情報を保持する文字列型の式(例: VARCHAR)。
オプション:
'parameter'検索に使用するパラメーターを指定する文字列定数。サポートされている値:
パラメーター
説明
dJSON オブジェクトでキーの重複を許可します。JSON オブジェクトに重複キーが含まれる場合、返されるオブジェクトには、そのキーに指定された最後の値を持つ、そのキーのインスタンスが1つ含まれます。
sJSON オブジェクトでキーの重複を許可しません(厳密)。この値がデフォルトです。
戻り値¶
JSON ドキュメントを含む型 VARIANT の値を返します。
入力が NULL の場合、関数は NULL を返します。
この関数は 構造化型 を返しません。
使用上の注意¶
この関数は、最大サイズ64 MB に圧縮された入力式をサポートします。
空文字列、または空白文字のみを含む文字列で PARSE_JSON 関数が呼び出された場合、空文字列は有効な JSON ではありませんが、関数は(エラーを発生させるのではなく) NULL を返します。この動作により、入力の一部が空文字列であっても、処理を中断せずに継続することができます。
入力が NULL の場合は、出力も NULL です。しかし、入力文字列が
'null'の場合は、 JSON null 値として解釈されるため、結果は SQL NULL ではなく、nullを含む有効な VARIANT 値になります。以下の例をご参照ください。10進数を解析するとき、 PARSE_JSON は123.45を DOUBLE 値ではなく NUMBER(5,2)として処理することにより、表現の正確さを保持しようとします。ただし、科学表記法を使用する数値(例えば、1.2345e+02)、または、範囲またはスケールの制限により固定小数点として保存できない数値は DOUBLE として保存されます。JSON は TIMESTAMP、 DATE、 TIME、または BINARY などの値をネイティブに表さないため、これらの値は文字列として表される必要があります。
JSON 内では、オブジェクト(別名「ディクショナリ」または「ハッシュ」)は、キーと値のペアの 順序付けられていない セットです。
TO_JSON および PARSE_JSON は(ほぼ)逆または相反する関数です。
PARSE_JSON 関数は入力として文字列を取り、JSON互換の VARIANT を返します。
TO_JSON 関数はJSON互換VARIANTを受け取り、文字列を返します。
Xが有効な JSON を含む文字列である場合、次は(概念的に)trueです。
X = TO_JSON(PARSE_JSON(X));例えば、次は(概念的に)trueです。
'{"pi":3.14,"e":2.71}' = TO_JSON(PARSE_JSON('{"pi":3.14,"e":2.71}'))ただし、関数は次の2つの理由で完全には逆数ではありません。
空の文字列、および空白のみの文字列は、相互に処理されません。例えば、
PARSE_JSON('')の戻り値は NULL ですが、TO_JSON(NULL)の戻り値は NULL であり、相反する''ではありません。TO_JSON によって生成される文字列内のキーと値のペアの順序は予測できません。
TO_JSON によって生成された文字列には、 PARSE_JSON に渡される文字列よりも少ない空白を含めることができます。
次は同等のJSONですが、同等の文字列ではありません。
{"pi": 3.14, "e": 2.71}{"e":2.71,"pi":3.14}
例¶
以下の例では、 PARSE_JSON 関数を使用しています。
VARIANT 列での異なるデータ型の値の格納¶
これは、 PARSE_JSON を呼び出して文字列を解析することにより、 VARIANT 列にさまざまな型のデータを保管する例を示しています。
テーブルを作成して入力します。INSERT ステートメントは、 PARSE_JSON を使用して VARIANT の値をテーブルの v 列に挿入します。
データをクエリする。このクエリは、 TYPEOF 関数を使用して VARIANT 値に保管されている値のデータ型を表示します。
VARIANT 値に、キーが重複する JSON オブジェクトを挿入します。¶
キーが重複している JSON オブジェクトを VARIANT 値に挿入しようとします。
デフォルトではキーの重複は許可されていないため、エラーが返されます。
キーが重複する JSON オブジェクトを VARIANT 値に挿入し、 d パラメーターで重複を許可するように指定します。
テーブルにクエリを実行すると、最後に重複したキーの値のみが挿入されていることがわかります。
PARSE_JSON と TO_JSON 関数を使用した NULL 値の処理¶
次の例は、 PARSE_JSON と TO_JSON が NULL 値をどのように処理するかを示しています。
PARSE_JSON と TO_JSON の比較¶
以下の例は、 PARSE_JSON と TO_JSON 関数の関係を示しています。
この例では、 VARCHAR 列と VARIANT 列を持つテーブルを作成します。INSERT ステートメントは VARCHAR 値を挿入し、 UPDATE ステートメントはその VARCHAR 値に対応する JSON 値を生成します。
このクエリは、 TO_JSON と PARSE_JSON が概念的に逆関数であることを示しています。
しかし、この関数は完全に逆数ではありません。空白またはキーと値のペアの順序が違うときは、出力が入力と一致しない場合があります。例:
PARSE_JSON と TO_VARIANT の比較¶
PARSE_JSON 関数と TO_VARIANT 関数の両方が文字列を受け取って VARIANT 値を返すことができますが、これらは同等ではありません。以下の例は、 VARIANT 列を2つ持つテーブルを作成しています。その後、 PARSE_JSON を使用して一方の列に値を挿入し、 TO_VARIANT を使用してもう一方の列に値を挿入します。
以下のクエリは、関数が異なるデータ型の値を保管する VARIANT 値を返したことを示しています。