Выражение со звездочкой
Примеры
Выбрать все столбцы, присутствующие в FROM:
SELECT * FROM table_name;
Подсчитать количество строк в таблице:
SELECT count(*) FROM table_name;
DuckDB предлагает сокращённую запись для count(*) выражений, где * можно опустить:
SELECT count() FROM table_name;
Выбрать все столбцы из таблицы под названием table_name:
SELECT table_name.* FROM table_name JOIN other_table_name USING (id);
Выбрать все столбцы, кроме столбца city из таблицы addresses:
SELECT * EXCLUDE (city) FROM addresses;
Выбрать все столбцы из таблицы addresses, но заменить city на lower(city):
SELECT * REPLACE (lower(city) AS city) FROM addresses;
Выбрать все столбцы, соответствующие заданному выражению:
SELECT COLUMNS(c -> c LIKE '%num%') FROM addresses;
Выбрать все столбцы, соответствующие заданному регулярному выражению из таблицы:
SELECT COLUMNS('number\d+')
FROM addresses; Выбрать столбцы, используя список:
SELECT COLUMNS(['city', 'zip_code']) FROM addresses;
Синтаксис
Выражение со звездочкой
Выражение со звездочкой может использоваться в операторе SELECT для выбора всех столбцов, которые проецируются в FROM.
SELECT * FROM tbl;
Выражение со звездочкой можно модифицировать с помощью EXCLUDE и REPLACE.
EXCLUDE Оператор
EXCLUDE позволяет исключить определённые столбцы из выражения *.
SELECT * EXCLUDE (col) FROM tbl;
REPLACE Оператор
REPLACE позволяет заменить определённые значения в столбцах, как указано в выражении.
SELECT * REPLACE (col / 1_000 AS col) FROM tbl;
COLUMNS Выражение
Выражение COLUMNS можно использовать для выполнения одного и того же выражения над значениями в нескольких столбцах. Например:
CREATE TABLE numbers (id INTEGER, number INTEGER); INSERT INTO numbers VALUES (1, 10), (2, 20), (3, NULL); SELECT min(COLUMNS(*)), count(COLUMNS(*)) FROM numbers;
| id | number | id | number |
|---|---|---|---|
| 1 | 10 | 3 | 2 |
Выражение * в операторе COLUMNS также может содержать EXCLUDE или REPLACE, аналогично обычным выражениям со звездочкой.
SELECT
min(COLUMNS(* REPLACE (number + id AS number))),
count(COLUMNS(* EXCLUDE (number)))
FROM numbers; | id | min(number := (number + id)) | id |
|---|---|---|
| 1 | 11 | 3 |
Выражения со звездочкой также могут быть объединены, при условии, что COLUMNS содержит одно и то же (звёздочное) выражение:
SELECT COLUMNS(*) + COLUMNS(*) FROM numbers;
| id | number |
|---|---|
| 2 | 20 |
| 4 | 40 |
| 6 | NULL |
Выражения со звездочкой также могут использоваться в WHERE операторах. Условия применяются ко всем столбцам и объединяются с помощью логического оператора AND.
SELECT *
FROM (
SELECT 0 AS x, 1 AS y, 2 AS z
UNION ALL
SELECT 1 AS x, 2 AS y, 3 AS z
UNION ALL
SELECT 2 AS x, 3 AS y, 4 AS z
)
WHERE COLUMNS(*) > 1; -- equivalent to: x > 1 AND y > 1 AND z > 1 | x | y | z |
|---|---|---|
| 2 | 3 | 4 |
COLUMNS Регулярное выражение
COLUMNS поддерживает передачу регулярного выражения в виде строковой константы:
SELECT COLUMNS('(id|numbers?)') FROM numbers; | id | number |
|---|---|
| 1 | 10 |
| 2 | 20 |
| 3 | NULL |
Переименование столбцов с использованием COLUMNS выражения
Совпадения групп захвата могут использоваться для переименования столбцов, выбранных по регулярному выражению. Группы захвата индексируются с 1; \0 — исходное имя столбца.
Например, чтобы выбрать первые три буквы имён столбцов, выполните:
SELECT COLUMNS('(\w{3}).*') AS '\1' FROM numbers; | id | num |
|---|---|
| 1 | 10 |
| 2 | 20 |
| 3 | NULL |
Чтобы удалить символ двоеточия (:) в середине имени столбца, выполните:
CREATE TABLE tbl ("Foo:Bar" INTEGER, "Foo:Baz" INTEGER, "Foo:Qux" INTEGER);
SELECT COLUMNS('(\w*):(\w*)') AS '\1\2' FROM tbl; COLUMNS Lambda-функция
COLUMNS также поддерживает передачу лямбда-функции. Лямбда-функция будет вычислена для всех столбцов, присутствующих в FROM разделе, и будут возвращены только те столбцы, которые соответствуют лямбда-функции. Это позволяет выполнить произвольные выражения для выбора и переименования столбцов.
SELECT COLUMNS(c -> c LIKE '%num%') FROM numbers;
| число |
|---|
| 10 |
| 20 |
| NULL |
*COLUMNS Развёрнутые столбцы
Раздел *COLUMNS является вариацией COLUMNS, который поддерживает все ранее упомянутые возможности. Разница заключается в том, как выражение расширяется.
*COLUMNS будет расширяться на месте, аналогично поведению развёртывания итерируемых объектов в Python, которое вдохновило синтаксис *. Это подразумевает, что выражение расширяется внутри родительского выражения. Пример, демонстрирующий разницу между COLUMNS и *COLUMNS.
С COLUMNS:
SELECT coalesce(COLUMNS(['a', 'b', 'c'])) AS result FROM (SELECT NULL a, 42 b, true c);
| результат | результат | результат |
|---|---|---|
| NULL | 42 | true |
С *COLUMNS, выражение расширяется внутри своего родительского выражения coalesce, что приводит к одному столбцу результатов:
SELECT coalesce(*COLUMNS(['a', 'b', 'c'])) AS result FROM (SELECT NULL AS a, 42 AS b, true AS c);
| результат |
|---|
| 42 |
*COLUMNS также работает с аргументом (*):
SELECT coalesce(*COLUMNS(*)) AS result FROM (SELECT NULL a, 42 AS b, true AS c);
| результат |
|---|
| 42 |
STRUCT.*
Выражение * также можно использовать для получения всех ключей из структуры в виде отдельных столбцов. Это особенно полезно, когда предыдущая операция создаёт структуру неизвестной формы или если запросу необходимо обработать все возможные ключи структуры. См. страницы STRUCT тип данных и STRUCT функций для получения более подробной информации о работе со структурами.
Например:
SELECT st.* FROM (SELECT {'x': 1, 'y': 2, 'z': 3} AS st); | x | y | z |
|---|---|---|
| 1 | 2 | 3 |
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/expressions/star.html