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;
| 列名 | 最小值 | 最大值 |
|---|---|---|
| 年份 | 2017 | 2017 |
| 季度 | 1 | 3 |
| 月份 | 1 | 9 |