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

NAMED_STRUCT

Описание​

Создаёт и возвращает структуру на основе заданных имён и значений полей. Функция принимает чётное число параметров: на нечётных позициях передаются имена полей, а на чётных — значения полей.

Синтаксис​

NAMED_STRUCT( <field_name> , <field_value> [ , <field_name> , <field_value> ... ] )

Параметры​

  • <field_name>: имя поля для построения структуры, передаваемое на нечётной позиции; должно быть строковой константой
  • <field_value>: значение поля для построения структуры, передаваемое на чётной позиции; в качестве значений можно использовать несколько столбцов или константы

Поддерживаемые типы элементов:

  • Числовые типы: TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL
  • Строковые типы: CHAR, VARCHAR, STRING
  • Типы даты и времени: DATE, DATETIME, DATEV2, DATETIMEV2
  • Логический тип: BOOLEAN
  • Типы IP: IPV4, IPV6
  • Сложные типы: ARRAY, MAP, STRUCT

Возвращаемое значение​

Тип возвращаемого значения: STRUCT

Описание возвращаемого значения:

  • Возвращает структуру, содержащую все указанные пары имён и значений полей
  • Все поля поддерживают значения NULL

Использование​

  • Функция объединяет все пары имён и значений полей в структуру. На нечётных позициях передаются имена полей (они должны быть строковыми константами и не должны повторяться; регистр не учитывается), а на чётных — значения полей (можно использовать несколько столбцов или константы)
  • Число параметров должно быть ненулевым, чётным и больше 1
  • Все поля помечаются как nullable

Примеры запросов:

Базовое использование:

select named_struct('name', 'Alice', 'age', 25, 'city', 'Beijing');
+-------------------------------------------------------------+
| named_struct('name', 'Alice', 'age', 25, 'city', 'Beijing') |
+-------------------------------------------------------------+
| {"name":"Alice", "age":25, "city":"Beijing"} |
+-------------------------------------------------------------+

С использованием значений NULL:

select named_struct('id', 1, 'name', null, 'score', 95.5);
+----------------------------------------------------+
| named_struct('id', 1, 'name', null, 'score', 95.5) |
+----------------------------------------------------+
| {"id":1, "name":null, "score":95.5} |
+----------------------------------------------------+

С использованием сложных типов:

select named_struct('array', [1,2,3], 'map', {'key':'value'}, 'struct', named_struct('f1',1,'f2',2));
+-----------------------------------------------------------------------------------------------+
| named_struct('array', [1,2,3], 'map', {'key':'value'}, 'struct', named_struct('f1',1,'f2',2)) |
+-----------------------------------------------------------------------------------------------+
| {"array":[1, 2, 3], "map":{"key":"value"}, "struct":{"f1":1, "f2":2}} |
+-----------------------------------------------------------------------------------------------+

Создание именованной структуры с IP-адресами:

select named_struct('ipv4', cast('192.168.1.1' as ipv4), 'ipv6', cast('2001:db8::1' as ipv6));
+----------------------------------------------------------------------------------------+
| named_struct('ipv4', cast('192.168.1.1' as ipv4), 'ipv6', cast('2001:db8::1' as ipv6)) |
+----------------------------------------------------------------------------------------+
| {"ipv4":"192.168.1.1", "ipv6":"2001:db8::1"} |
+----------------------------------------------------------------------------------------+

Примеры ошибок

Менее 2 параметров:

select named_Struct();
ERROR 1105 (HY000): errCode = 2, detailMessage = named_struct requires at least two arguments, like: named_struct('a', 1)

select named_struct('name');
ERROR 1105 (HY000): errCode = 2, detailMessage = named_struct requires at least two arguments, like: named_struct('a', 1)

Нечётное число параметров:

select named_struct('name', 'Alice', 'age');
ERROR 1105 (HY000): errCode = 2, detailMessage = named_struct can't be odd parameters, need even parameters named_struct('name', 'Alice', 'age')

Повторяющиеся имена полей; регистр в именах полей не учитывается:

select named_struct('name', 'Alice', 'name', 'Bob');
ERROR 1105 (HY000): errCode = 2, detailMessage = The name of the struct field cannot be repeated. same name fields are name

select named_struct('name', 'Alice', 'Name', 'Bob');
ERROR 1105 (HY000): errCode = 2, detailMessage = The name of the struct field cannot be repeated. same name fields are name