NORMALIZE_JSON_NUMBERS_TO_DOUBLE
Описание
Функция NORMALIZE_JSON_NUMBERS_TO_DOUBLE преобразует все числовые значения в JSON в тип с плавающей запятой двойной точности. Она принимает значение JSON и возвращает новое значение JSON, в котором все числовые типы преобразованы в значения двойной точности.
Синтаксис
NORMALIZE_JSON_NUMBERS_TO_DOUBLE(json_value)
Псевдоним
NORMALIZE_JSONB_NUMBERS_TO_DOUBLE
Параметры
json_value — Обрабатываемое значение JSON. Должно иметь тип JSON.
Возвращаемое значение
Возвращает новое значение JSON, в котором все числовые типы преобразованы в тип с плавающей запятой двойной точности (double).
Если входное значение — NULL, функция возвращает NULL.
Назначение
Поскольку стандарт JSON не определяет базовый тип для Number, в большинстве систем тип Number реализован на основе двоичных 64-битных чисел с плавающей запятой двойной точности по стандарту IEEE 754-2008 (например, типа double в C++). Чтобы обеспечить точность данных, в Doris тип Number расширен более специализированными типами с поддержкой более точных типов, таких как Int128 и DECIMAL. Однако это может приводить к различиям по сравнению с другими системами.
Например, для следующей строки JSON:
'{"abc": 18446744073709551616}'
В системах, использующих Double в качестве базового типа для чисел JSON, например в MySQL, результат будет следующим:
+-----------------------------------------------+
| cast('{"abc": 18446744073709551616}' as json) |
+-----------------------------------------------+
| {"abc": 1.8446744073709552e19} |
+-----------------------------------------------+
Но поскольку для чисел JSON в Doris доступны типы с более высокой точностью, результат будет следующим:
+-----------------------------------------------+
| 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, а только представление чисел внутри него.