NORMALIZE_JSON_NUMBERS_TO_DOUBLE
説明
NORMALIZE_JSON_NUMBERS_TO_DOUBLE 関数は、JSON 内のすべての数値を倍精度浮動小数点数に変換します。JSON 値を入力として受け取り、すべての数値を double 型に変換した新しい JSON 値を返します。
構文
NORMALIZE_JSON_NUMBERS_TO_DOUBLE(json_value)
別名
NORMALIZE_JSONB_NUMBERS_TO_DOUBLE
パラメータ
json_value: 処理する JSON 値です。JSON 型である必要があります。
戻り値
すべての数値を倍精度浮動小数点数 (double) に変換した新しい JSON 値を返します。
入力が NULL の場合は NULL を返します。
用途
JSON 標準では Number の内部型が定義されていないため、ほとんどのシステムは IEEE 754-2008 の 64 ビット倍精度浮動小数点数 (C++ の double 型など) として Number を実装します。 Doris はデータの精度を保つため、Number 型を拡張し、Int128 や DECIMAL などのより高精度な型をサポートしています。 このため、他のシステムと結果が異なる場合があります。
たとえば、次の JSON 文字列について考えます。
'{"abc": 18446744073709551616}'
MySQL のように JSON の数値に Double を使用するシステムでは、次の結果になります。
+-----------------------------------------------+
| cast('{"abc": 18446744073709551616}' as json) |
+-----------------------------------------------+
| {"abc": 1.8446744073709552e19} |
+-----------------------------------------------+
一方、Doris の JSON Number はより高精度な型を使用するため、次の結果になります。
+-----------------------------------------------+
| cast('{"abc": 18446744073709551616}' as json) |
+-----------------------------------------------+
| {"abc":18446744073709551616} |
+-----------------------------------------------+
他のシステムとの互換性を確保するには、NORMALIZE_JSON_NUMBERS_TO_DOUBLE を使用します。
+---------------------------------------------------------------------------------+
| normalize_json_numbers_to_double(cast('{"abc": 18446744073709551616}' as json)) |
+---------------------------------------------------------------------------------+
| {"abc":1.8446744073709552e+19} |
+---------------------------------------------------------------------------------+
例
基本的な数値変換
SELECT normalize_json_numbers_to_double(cast('{"b":1234567890123456789,"b":456,"a":789}' as json));
+---------------------------------------------------------------------------------------------+
| normalize_json_numbers_to_double(cast('{"b":1234567890123456789,"b":456,"a":789}' as json)) |
+---------------------------------------------------------------------------------------------+
| {"b":1.2345678901234568e+18,"b":456,"a":789} |
+---------------------------------------------------------------------------------------------+
ネストした JSON の処理
SELECT normalize_json_numbers_to_double(cast('{"object":{"int":123,"bigint":1234567890123456789},"array":[123,456,789]}' as json));
+-----------------------------------------------------------------------------------------------------------------------------+
| normalize_json_numbers_to_double(cast('{"object":{"int":123,"bigint":1234567890123456789},"array":[123,456,789]}' as json)) |
+-----------------------------------------------------------------------------------------------------------------------------+
| {"object":{"int":123,"bigint":1.2345678901234568e+18},"array":[123,456,789]} |
+-----------------------------------------------------------------------------------------------------------------------------+
NULL 値の処理
SELECT normalize_json_numbers_to_double(null);
+----------------------------------------+
| normalize_json_numbers_to_double(null) |
+----------------------------------------+
| NULL |
+----------------------------------------+
注意事項
-
NORMALIZE_JSON_NUMBERS_TO_DOUBLEには別名NORMALIZE_JSONB_NUMBERS_TO_DOUBLEがあり、両者の機能は同じです。 -
JSON 内のすべての数値型 (整数、浮動小数点数、DECIMAL を含む) を倍精度浮動小数点数に変換します。
-
非常に大きな整数は、倍精度浮動小数点数への変換時に精度が失われる場合があります。例では 1234567890123456789 が 1.2345678901234568e+18 に変換されます。
-
JSON の構造は変更せず、内部の数値の表現だけを変更します。