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 |