Spec-Zone.ru › DuckDB

Выражение со звездочкой

Примеры

Выбрать все столбцы, присутствующие в 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API