⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
query 和 query_table 函数

query_tablequery 函数支持强大且更具动态性的 SQL。

query_table 函数返回由其字符串参数指定的表;query 函数返回通过执行其字符串参数指定的查询所得到的表。

这两个函数仅接受常量字符串。例如,它们允许将表名作为预处理语句参数传入。

CREATE TABLE my_table (i INTEGER);
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(最大值)
年份 2017 2017
quarter 1 3
month 1 9

query 函数允许更高的灵活性。例如,比起 SQL 的 UNPIVOT 语法,更喜欢 pandas 的 stack 语法的用户可以使用:

CREATE OR REPLACE MACRO stack(table_name, index, name, values) AS TABLE 
FROM query(
    'UNPIVOT ' || table_name 
    || ' ON COLUMNS(* EXCLUDE (' || array_to_string(index, ', ') 
    || ')) INTO NAME ' || name || ' VALUES ' || values
);

WITH cities AS (
    FROM (
        VALUES 
            ('NL', 'Amsterdam', '10', '12', '15'),
            ('US', 'New York', '100', '120', '150')
    ) _(country, city, '2000', '2010', '2020')
)
SELECT *
FROM stack('cities', ['country', 'city'], 'year', 'population');
国家 城市 年份 population(人口)
NL Amsterdam 2000 10
NL Amsterdam 2010 12
NL Amsterdam 2020 15
美国 New York(纽约) 2000 100
美国 New York(纽约) 2010 120
美国 New York(纽约) 2020 150
© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南