NORMALIZE_JSON_NUMBERS_TO_DOUBLE
説明
NORMALIZE_JSON_NUMBERS_TO_DOUBLE 関数は、JSON内のすべての数値を倍精度浮動小数点型に変換します。この関数はJSON値を入力として受け取り、すべての数値型が倍精度値に変換された新しいJSON値を返します。
構文
NORMALIZE_JSON_NUMBERS_TO_DOUBLE(json_value)
Alias
NORMALIZE_JSONB_NUMBERS_TO_DOUBLE
パラメータ
json_value - 処理対象のJSON値。JSON型である必要があります。
Return Value
すべての数値型がdouble精度浮動小数点(double)型に変換された新しいJSON値を返します。
入力がNULLの場合、この関数はNULLを返します。
Purpose
JSON標準では Number の基盤となる型が規定されていないため、ほとんどのシステムは IEEE 754-2008 binary 64-bit(double精度)浮動小数点数(C++のdouble型など)に基づいて Number 型を実装しています。 データの精度を確保するため、Doris は Number 型をより詳細な型で拡張し、Int128 や DECIMAL などのより精密な型をサポートしています。 しかし、これにより他のシステムと比較した際に差異が生じる可能性があります。
例えば、以下のJSON文字列の場合:
'{"abc": 18446744073709551616}'
Double をJSON Numbersの基盤となる型として使用するシステム(MySQL など)では、以下のような結果が得られます:
+-----------------------------------------------+
| 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の構造を変更せず、その中の数値表現のみを変更します。