Тип списка
Столбец LIST кодирует списки значений. Поля в столбце могут иметь значения различной длины, но все они должны иметь одинаковый базовый тип. LIST обычно используются для хранения массивов чисел, но могут содержать любой однородный тип данных, включая другие LIST и STRUCT.
LIST аналогичны типу ARRAY PostgreSQL. DuckDB использует терминологию LIST, но для совместимости с PostgreSQL предоставлены некоторые array_ функции.
См. обзор типов данных для сравнения вложенных типов данных.
Для хранения списков фиксированной длины DuckDB использует тип
ARRAY.
Создание списков
Списки можно создать, используя функцию list_value(expr, ...) или эквивалентную нотацию в квадратных скобках [expr, ...]. Выражения могут быть константами или произвольными выражениями. Чтобы создать список из столбца таблицы, используйте агрегатную функцию list.
Список целых чисел:
SELECT [1, 2, 3];
Список строк со значением NULL:
SELECT ['duck', 'goose', NULL, 'heron'];
Список списков со значениями NULL:
SELECT [['duck', 'goose', 'heron'], NULL, ['frog', 'toad'], []];
Создать список с помощью функции list_value:
SELECT list_value(1, 2, 3);
Создать таблицу со столбцом списка INTEGER и столбцом списка VARCHAR:
CREATE TABLE list_table (int_list INTEGER[], varchar_list VARCHAR[]);
Извлечение из списков
Извлечение одного или нескольких значений из списка можно выполнить с помощью квадратных скобок и нотации срезов или с помощью функций для списков, таких как list_extract. Для совместимости с системами, которые называют списки массивами, предоставляются несколько эквивалентных функций в качестве псевдонимов. Например, функция array_slice.
Мы заключаем создание списка в скобки, чтобы оно выполнялось в первую очередь. Это необходимо только в наших базовых примерах, а не при работе со столбцом списка. Например, это не может быть проанализировано:
SELECT ['a', 'b', 'c'][1].
| Пример | Результат |
|---|---|
| SELECT (['a', 'b', 'c'])[3] | 'c' |
| SELECT (['a', 'b', 'c'])[-1] | 'c' |
| SELECT (['a', 'b', 'c'])[2 + 1] | 'c' |
| SELECT list_extract(['a', 'b', 'c'], 3) | 'c' |
| SELECT (['a', 'b', 'c'])[1:2] | ['a', 'b'] |
| SELECT (['a', 'b', 'c'])[:2] | ['a', 'b'] |
| SELECT (['a', 'b', 'c'])[-2:] | ['b', 'c'] |
| SELECT list_slice(['a', 'b', 'c'], 2, 3) | ['b', 'c'] |
Сравнение и сортировка
Тип LIST можно сравнивать с помощью всех операторов сравнения. Эти сравнения можно использовать в логических выражениях, таких как WHERE и HAVING-оператор, и возвращают BOOLEAN значения.
Порядок LIST определяется позиционно с использованием следующих правил, где min_len = min(len(l1), len(l2)).
-
Равенство.
l1иl2равны, если для каждогоiв[1, min_len]:l1[i] = l2[i]. -
Меньше. Для первого индекса
iв[1, min_len], гдеl1[i] != l2[i]: Еслиl1[i] < l2[i],l1меньшеl2.
NULL значения сравниваются согласно семантике PostgreSQL. Для разрешения ничьих используются более низкие уровни вложения.
Вот некоторые запросы, возвращающие true для сравнения.
SELECT [1, 2] < [1, 3] AS result;
SELECT [[1], [2, 4, 5]] < [[2]] AS result;
SELECT [ ] < [1] AS result;
Эти запросы возвращают false.
SELECT [ ] < [ ] AS result;
SELECT [1, 2] < [1] AS result;
Эти запросы возвращают NULL.
SELECT [1, 2] < [1, NULL, 4] AS result;
Обновление списков
Обновления списков внутренне представляются как операция вставки и удаления. Поэтому обновление значений списка может привести к ошибке дублирования ключа в первичных/уникальных ключах. См. следующий пример:
CREATE TABLE tbl (id INTEGER PRIMARY KEY, lst INTEGER[], comment VARCHAR); INSERT INTO tbl VALUES (1, [12, 34], 'asd'); UPDATE tbl SET lst = [56, 78] WHERE id = 1;
Constraint Error: Duplicate key "id: 1" violates primary key constraint. If this is an unexpected constraint violation please double check with the known index limitations section in our documentation (https://duckdb.org/docs/sql/indexes).
Функции
См. Функции для списков.
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/data_types/list.html