Перейти к содержимому
Последнее обновление

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 |
+----------------------------------------+

Примечания​

  1. У функции NORMALIZE_JSON_NUMBERS_TO_DOUBLE есть псевдоним NORMALIZE_JSONB_NUMBERS_TO_DOUBLE; обе функции работают одинаково.

  2. Эта функция преобразует все числовые типы в JSON (включая целые числа, числа с плавающей запятой и значения DECIMAL) в представление с плавающей запятой двойной точности.

  3. Для особенно больших целых чисел преобразование в число с плавающей запятой двойной точности может привести к потере точности, как показано в примере, где 1234567890123456789 преобразуется в 1.2345678901234568e+18.

  4. Эта функция не изменяет структуру JSON, а только представление чисел внутри него.