Функции query и query_table
Функции query и query_table принимают строковый литерал и преобразуют его в подзапрос SELECT и ссылку на таблицу соответственно. Обратите внимание, что эти функции принимают только строковые литералы. Поэтому они не так мощны (или опасны), как общая функция eval.
Эти функции концептуально просты, но позволяют создавать мощные и более динамичные запросы SQL. Например, они позволяют передавать имя таблицы в качестве параметра подготовленного оператора:
CREATE TABLE my_table(i INT);
INSERT INTO my_table VALUES (42);
PREPARE select_from_table AS SELECT * FROM query_table($1);
EXECUTE select_from_table('my_table'); | i |
|---|
| 42 |
В сочетании с COLUMNS выражением мы можем создавать очень универсальные макросы только на языке SQL. Например, ниже приведена пользовательская версия SUMMARIZE, которая вычисляет min и max для каждого столбца в таблице:
CREATE OR REPLACE MACRO my_summarize(table_name) AS TABLE
SELECT
unnest([*COLUMNS('alias_.*')]) AS column_name,
unnest([*COLUMNS('min_.*')]) AS min_value,
unnest([*COLUMNS('max_.*')]) AS max_value
FROM (
SELECT
any_value(alias(COLUMNS(*))) AS "alias_\0",
min(COLUMNS(*))::VARCHAR AS "min_\0",
max(COLUMNS(*))::VARCHAR AS "max_\0"
FROM query_table(table_name::VARCHAR)
);
SELECT *
FROM my_summarize('https://blobs.duckdb.org/data/ontime.parquet')
LIMIT 3; | column_name | min_value | max_value |
|---|---|---|
| year | 2017 | 2017 |
| quarter | 1 | 3 |
| month | 1 | 9 |
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/guides/sql_features/query_and_query_table_functions.html