query 및 query_table 함수

query 및 query_table 함수 (query and query_table Functions)

query_tablequery 함수는 더 강력하고 동적인 SQL을 가능하게 해줍니다.

query_table 함수는 문자열 인수로 지정된 이름의 테이블을 반환하고, query 함수는 문자열 인수로 지정된 쿼리를 실행한 결과 테이블을 반환합니다.

두 함수 모두 상수 문자열만 받습니다. 예를 들어, prepared statement 파라미터로 테이블 이름을 넘길 수 있습니다.

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만으로 아주 범용적인 매크로를 작성할 수 있습니다. 아래는 테이블의 모든 컬럼에 대해 min/max를 계산하는, SUMMARIZE를 직접 구현한 커스텀 버전입니다.

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

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');
country city year population
NL Amsterdam 2000 10
NL Amsterdam 2010 12
NL Amsterdam 2020 15
US New York 2000 100
US New York 2010 120
US New York 2020 150

더 알아보기 (Learn more)