Предположим, у меня есть следующий макрос:
CREATE OR REPLACE MACRO hello_world(col_name, series_start, series_end) AS TABLE (
SELECT generate_series::VARCHAR AS col_name
FROM generate_series(series_start, series_end)
);
CREATE OR REPLACE TABLE tbl AS
FROM hello_world('world', 3, 5);
SHOW TABLES;
Исполнение производит:
┌─────────┐
│ name │
│ varchar │
├─────────┤
│ tbl │
└─────────┘
┌──────────┐
│ col_name │
│ varchar │
├──────────┤
│ 3 │
│ 4 │
│ 5 │
└──────────┘
Но мне нужен столбец с именем «мир», но я получил столбец с именем col_name
(имя параметра макроса): так как мне правильно убедиться, что значение параметра макроса используется в качестве имени столбца?
В связи с аналогичным вопросом один из авторитетов DuckDB написал:
Далее автор подчеркивает различие между идентификаторами и выражениями.
Как правило, это может означать, что если формальный аргумент игнорируется, то это происходит из-за принципа, изложенного выше. Другими словами, это особенность. Это не означает, что запрос на улучшение не может быть сделан. А пока можно конечно alter table tbl rename 'col_name' to 'world';
Да, «макро» очень вводит в заблуждение. Альтернативой подходу на языке программирования может быть «динамический sql» на основе CLI DuckDB (например, с использованием .once и .read). Но запрос на улучшение может изменить ситуацию.
Если вы создадите строку запроса, ее можно выполнить с помощью json_execute_serialized_sql()
duckdb.sql("""
create or replace macro hello_world(col_name, series_start, series_end) as table (
from json_execute_serialized_sql(json_serialize_sql(
format('
select generate_series::varchar as {}
from generate_series({}, {})
', col_name, series_start, series_end)
))
)
""")
duckdb.sql("""
create or replace table tbl as from hello_world('world', 3, 5);
from tbl
""")
┌─────────┐
│ world │
│ varchar │
├─────────┤
│ 3 │
│ 4 │
│ 5 │
└─────────┘
Спасибо. Я думаю, что это очень странно, что я не могу использовать переменную как переменную. Я мог бы сделать
alter table tbl rename 'col_name' to 'world';
, но при этом игнорируется тот факт, что я не знаю, чтоcol_name
является'world'
для варианта использования, о котором я думал ---col_name
действительно является переменной. В целом, ответ, который, по-видимому, связан с этой проблемой вместе с другими, заключается в том, что DuckDB SQL заключается в том, что он предназначен для генерации каким-либо другим языком (например, с использованием Python).