query 및 query_table 함수
query 및 query_table 함수 (query and query_table Functions)
query_table과 query 함수는 더 강력하고 동적인 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)
- 테이블 매크로 작성 방법: CREATE MACRO
- COLUMNS 표현식 활용: Star expression
- UNPIVOT / PIVOT 구문: PIVOT