STRUCT_ELEMENT
Поскольку ни одна другая база данных или движок запросов не предоставляет подобную функцию, STRUCT_ELEMENT удалена начиная с версии 4.1.3. Используйте вместо неё функцию ELEMENT_AT (или эквивалентный синтаксис обращения по индексу s[k] / s['field_name'] и через точку s.field_name).
Описание
Возвращает указанное поле из столбца данных типа struct. Функция поддерживает доступ к полям struct по позиции (индексу) или имени поля.
Синтаксис
STRUCT_ELEMENT( <struct>, <field_location_or_name> )
Параметры
<struct>: Входной столбец типа struct<field_location_or_name>: Позиция поля (начиная с 1) или имя поля; поддерживаются только константы
Возвращаемое значение
Тип возвращаемого значения: тип значения поля, поддерживаемый struct
Значение результата:
- Возвращается значение указанного поля
- Если входное значение struct равно null, возвращается null
- Если указанное поле не существует, возникает ошибка
Использование
- Поддерживается доступ по позиции поля (индексу); индексация начинается с 1
- Поддерживается доступ по имени поля; имя поля сопоставляется без учёта регистра
- Второй параметр должен быть константой (не может быть столбцом)
- Функция помечена как AlwaysNullable; возвращаемое значение может быть null
- Начиная с версии 4.1.3,
STRUCT_ELEMENTудалена. Используйте вместо неёELEMENT_AT(<struct>, ...), операторы обращения по индексу<struct>[<index>]/<struct>['<field_name>']или оператор точки<struct_col>.<field_name>. Все эти способы доступа к полю struct эквивалентны.
Примеры
Примеры запросов:
Доступ по позиции:
select struct_element(named_struct('name', 'Alice', 'age', 25, 'city', 'Beijing'), 1);
+--------------------------------------------------------------------------------+
| struct_element(named_struct('name', 'Alice', 'age', 25, 'city', 'Beijing'), 1) |
+--------------------------------------------------------------------------------+
| Alice |
+--------------------------------------------------------------------------------+
Доступ по имени поля:
select struct_element(named_struct('name', 'Alice', 'age', 25, 'city', 'Beijing'), 'age');
+------------------------------------------------------------------------------------+
| struct_element(named_struct('name', 'Alice', 'age', 25, 'city', 'Beijing'), 'age') |
+------------------------------------------------------------------------------------+
| 25 |
+------------------------------------------------------------------------------------+
Доступ с помощью оператора обращения по индексу (эквивалентен вызовам выше):
select named_struct('name', 'Alice', 'age', 25, 'city', 'Beijing')[1] as by_index,
named_struct('name', 'Alice', 'age', 25, 'city', 'Beijing')['age'] as by_name;
+----------+---------+
| by_index | by_name |
+----------+---------+
| Alice | 25 |
+----------+---------+
Доступ к полям структуры struct, содержащей сложные типы:
select struct_element(named_struct('array', [1,2,3], 'map', {'key':'value'}), 'array');
+---------------------------------------------------------------------------------+
| struct_element(named_struct('array', [1,2,3], 'map', {'key':'value'}), 'array') |
+---------------------------------------------------------------------------------+
| [1, 2, 3] |
+---------------------------------------------------------------------------------+
Доступ к полю со значением null:
select struct_element(named_struct('name', null, 'age', 25), 'name');
+---------------------------------------------------------------+
| struct_element(named_struct('name', null, 'age', 25), 'name') |
+---------------------------------------------------------------+
| NULL |
+---------------------------------------------------------------+
Примеры ошибок
Доступ по имени несуществующего поля:
select struct_element(named_struct('name', 'Alice', 'age', 25), 'nonexistent');
ERROR 1105 (HY000): errCode = 2, detailMessage = the specified field name nonexistent was not found: struct_element(named_struct('name', 'Alice', 'age', 25), 'nonexistent')
Доступ по индексу за пределами допустимого диапазона:
select struct_element(named_struct('name', 'Alice', 'age', 25), 5);
ERROR 1105 (HY000): errCode = 2, detailMessage = the specified field index out of bound: struct_element(named_struct('name', 'Alice', 'age', 25), 5)
Второй параметр не является константой:
select struct_element(named_struct('name', 'Alice', 'age', 25), inv) from var_with_index where k = 4;
ERROR 1105 (HY000): errCode = 2, detailMessage = element_at over a struct only allows a constant int or string second parameter: element_at(named_struct('name', 'Alice', 'age', 25), inv)
Если входное значение struct равно NULL, возникает ошибка:
select struct_element(NULL, 5);
ERROR 1105 (HY000): errCode = 2, detailMessage = Can not find the compatibility function signature: struct_element(NULL, TINYINT)