🍓

DuckDB の prefix aliases が見た目キモいけど便利そう

に公開

DuckDB v1.2.0 で、prefix aliases という新しい SQL の文法が入りました。これがどういうものかというと、

SELECT
    col1 AS value1,
    col1 + col2 AS value2,
    col1 + col2 + col3 AS value3,
FROM tbl

と書くところを[1]

SELECT
    value1: col1,
    value2: col1 + col2,
    value3: col1 + col2 + col3,
FROM tbl

というように alias を前に持ってこれます[2]。これは、いくら DuckDB のSQL は斬新だと知っていても、これまでの SQL を見慣れた目にとってはちょっと刺激的すぎるというか、さすがにキモすぎない...?と思ってしまうのですが、まあでも可能性を感じます。

何がいいかと言うと、SQL でいろいろな統計量を計算しようと思う時、書いた行をコピーしてちょっと変える、みたいな作業がよくあって、そういう時はその行の後ろの方からいじるので、AS <alias> が邪魔になります。例えば、後ろから足したりとか、

      col1 + col2 + col3 AS value3,
+     col1 + col2 + col3 + col4 AS value4,

後ろから割ったりとかします。

      col1 + col2 + col3 AS value3,
+     (col1 + col2 + col3) / sum(col1 + col2 + col3) over (partition by category) AS "%",

このとき、カーソルを動かすのに、行末にあるのが AS <alias>, よりも , だけの方が圧倒的に楽じゃないですか? しかも私は AS の位置を揃えたいとか思っちゃうタイプなので、実際にはこんな感じで書くんですけど、クエリの中身と AS が離れていて読みづらいです。

SELECT
    col1                                                                        AS value1,
    col1 + col2                                                                 AS value2,
    col1 + col2 + col3                                                          AS value3,
    (col1 + col2 + col3) / sum(col1 + col2 + col3) over (partition by category) AS "%",
FROM tbl

こっちの方が読みやすくないですか? しかもスペースで位置を調整しなくていいので楽だし。

SELECT
    value1: col1,
    value2: col1 + col2,
    value3: col1 + col2 + col3,
    "%":    (col1 + col2 + col3) / sum(col1 + col2 + col3) over (partition by category),
FROM tbl

DuckDB がこれをどれくらい本気ではやらせようとしてるのかはわからないのですが、ブログを読むとまんざらでもない感じするので、このまま SQL 新文法界のトップランナーであり続けてほしいです。

https://duckdb.org/2025/02/25/prefix-aliases-in-sql.html

脚注
  1. ちなみにこの SQL を見て「この , エラーになるのでは...?」と不安になった人に言っておくと、DuckDB は trailing comma を許容します。 ↩︎

  2. 今回は SELECT のあとの部分だけについて扱っていますが、 FROM のあと(つまり、テーブルのエイリアス)にも使えます。 ↩︎

Discussion