Последнее обновление
ELEMENT_AT
Функция
Функция ELEMENT_AT извлекает значение элемента из массива, отображения, структуры или значения типа 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: строковый тип.
- Для
Возвращаемое значение
- Для
ARRAY: возвращает элемент по указанному индексу (типT). - Для
MAP: возвращает значение, соответствующее указанному ключу (типV). - Для
STRUCT: возвращает значение указанного вложенного поля. - Для
VARIANT: возвращает значение типаVARIANT. - Если индекс или ключ не существует, возвращает
NULL(дляSTRUCTпозиция за пределами допустимого диапазона или несуществующее имя поля вызывают ошибку). - Если параметр равен
NULL, возвращаетNULL.
Примечания
- Индексы массива начинаются с 1, а не с 0.
- Поддерживаются отрицательные индексы:
-1обозначает последний элемент,-2— предпоследний и так далее. - Функция
ELEMENT_AT(container, key_or_index)работает так же, какcontainer[key_or_index](подробнее см. примеры).
Примеры
-
Функция
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, возвращается пустое значение.SELECT ELEMENT_AT(CAST('{"a": 1, "b": 2}' AS VARIANT), "a");
+------------------------------------------------------+
| ELEMENT_AT(CAST('{"a": 1, "b": 2}' AS VARIANT), "a") |
+------------------------------------------------------+
| 1 |
+------------------------------------------------------+
SELECT ELEMENT_AT(CAST('123' AS VARIANT), "");
+----------------------------------------+
| ELEMENT_AT(CAST('123' AS VARIANT), "") |
+----------------------------------------+
| |
+----------------------------------------+