Последнее обновление
ELEMENT_AT
Назначение
Функция ELEMENT_AT извлекает значение элемента из ARRAY, MAP, STRUCT или VARIANT по указанному индексу или ключу.
- Для ARRAY возвращает элемент в указанной позиции.
- Для MAP возвращает значение, соответствующее указанному ключу.
- Для STRUCT возвращает вложенное поле в указанной позиции (начиная с 1) или с указанным именем поля, что эквивалентно
STRUCT_ELEMENT. - Для VARIANT возвращает значение указанного вложенного поля.
Синтаксис
ELEMENT_AT(container, key_or_index)
Параметры
container: Может иметь типARRAY,MAP,STRUCTилиVARIANT.key_or_index:- Для
ARRAY: Целое число; индексация начинается с 1. - Для
MAP: Ключ типаKизMAP, который может иметь любой поддерживаемый примитивный тип. - Для
STRUCT: Константная целочисленная позиция поля (начиная с 1) или константное строковое имя поля (сопоставляется без учёта регистра). - Для доступа к объекту
VARIANT: Строковый ключ. - Для массива VARIANT в Doris 5.0.0 и более поздних версиях: Целочисленный индекс; положительные индексы начинаются с 1, а отрицательные отсчитываются от конца.
- Для
Возвращаемое значение
- Для
ARRAY: Возвращает элемент по указанному индексу (типаT). - Для
MAP: Возвращает значение, соответствующее указанному ключу (типаV). - Для
STRUCT: Возвращает значение указанного вложенного поля. - Для
VARIANT: Возвращает значение типаVARIANT. При отсутствии ключа, индексе0, индексе за пределами диапазона, строковом ключе для массива, целочисленном индексе для объекта или ключе для скалярного значения возвращаетNULL. - Если индекс или ключ не существует, возвращает
NULL(дляSTRUCTпозиция за пределами диапазона или несуществующее имя поля приводят к ошибке). - Если параметр равен
NULL, возвращаетNULL.
Примечания
- Индексы массивов ARRAY, а в Doris 5.0.0 и более поздних версиях также массивов VARIANT, начинаются с 1, а не с 0.
- Для доступа к элементам ARRAY и массивов VARIANT поддерживаются отрицательные индексы:
-1обозначает последний элемент,-2обозначает предпоследний и так далее. - Функция
ELEMENT_AT(container, key_or_index)работает так же, какcontainer[key_or_index](подробнее см. примеры).
SELECT ELEMENT_AT(parse_to_variant('[10, 20, 30]'), 1); -- 10
SELECT ELEMENT_AT(parse_to_variant('[10, 20, 30]'), 2); -- 20
SELECT ELEMENT_AT(parse_to_variant('[10, 20, 30]'), -1); -- 30
- Для
VARIANTполе со значением JSONnullв значении, вычисленном в запросе, возвращается как VARIANTnull, который отличается от SQLNULL. В данных, считываемых из таблицы, поля со значениемnullв объектах вне массивов не сохраняются, поэтому такое же обращение возвращает SQLNULL. См. Семантика NULL.
Примеры
-
Функция
ELEMENT_ATработает так же, как[].SELECT ELEMENT_AT([1, 2, 3], 2);
+--------------------------+
| ELEMENT_AT([1, 2, 3], 2) |
+--------------------------+
| 2 |
+--------------------------+
SELECT [1, 2, 3][2];
+--------------+
| [1, 2, 3][2] |
+--------------+
| 2 |
+--------------+ -
Индексация массивов начинается с 1; обращение за пределами массива возвращает
NULL.SELECT ELEMENT_AT([1, 2, 3], 0);
+--------------------------+
| ELEMENT_AT([1, 2, 3], 0) |
+--------------------------+
| NULL |
+--------------------------+
SELECT ELEMENT_AT([1, 2, 3], 4);
+--------------------------+
| ELEMENT_AT([1, 2, 3], 4) |
+--------------------------+
| NULL |
+--------------------------+ -
Обращение к несуществующему ключу в
MAPвозвращаетNULL.SELECT ELEMENT_AT({"a": 1, "b": 2}, "c");
+-----------------------------------+
| ELEMENT_AT({"a": 1, "b": 2}, "c") |
+-----------------------------------+
| NULL |
+-----------------------------------+ -
Доступ к вложенному полю
STRUCTпо позиции или имени поля (эквивалентноSTRUCT_ELEMENT).SELECT ELEMENT_AT(NAMED_STRUCT('name', 'Jack', 'id', 1728923), 1);
+------------------------------------------------------------+
| ELEMENT_AT(NAMED_STRUCT('name', 'Jack', 'id', 1728923), 1) |
+------------------------------------------------------------+
| Jack |
+------------------------------------------------------------+
SELECT NAMED_STRUCT('name', 'Jack', 'id', 1728923)['id'];
+--------------------------------------------------+
| NAMED_STRUCT('name', 'Jack', 'id', 1728923)['id'] |
+--------------------------------------------------+
| 1728923 |
+--------------------------------------------------+ -
Если при обращении к вложенному полю
VARIANTзначениеVARIANTне является OBJECT, возвращаетсяNULL.SELECT ELEMENT_AT(PARSE_TO_VARIANT('{"a": 1, "b": 2}'), "a");
+-------------------------------------------------------+
| ELEMENT_AT(PARSE_TO_VARIANT('{"a": 1, "b": 2}'), "a") |
+-------------------------------------------------------+
| 1 |
+-------------------------------------------------------+
SELECT ELEMENT_AT(PARSE_TO_VARIANT('123'), "");
+-------------------------------------------+
| ELEMENT_AT(PARSE_TO_VARIANT('123'), "") |
+-------------------------------------------+
| NULL |
+-------------------------------------------+