今天我們從一個有趣的 SQL 問題開始,介紹我一個很愛的 DuckDB SQL 特性 Lateral Column Alias
這段 SQL 語句有什麼問題?
SELECT 42 AS a, a + 1 AS b
在 Postgres 中,你會遇到一個錯誤,column ‘a’ does not exist
要解決這個問題(Postgres),需要使用 Common Table Expressions (CTEs) 或子查詢。
我曾經疑惑,為什麼不能在同一個 SELECT 列表中重複使用你已經定義的表達式呢?
這就是 Lateral Column Alias
派上用場的時候 😄,Lateral 就是 Lateral Join 的那個意思,代表你可以重複使用 SELECT 中先出現的表達式
所以這句
SELECT 42 AS a, a + 1 AS b
在 DuckDB 可以跑出我們心中的那個結果。
不過問題來了,為什麼 Postgres 不支援這種寫法 ?
我們把上面的 query 稍微延伸一下
SELECT 42 AS a, a + 1 AS b FROM t
你猜到問題了嗎 ?
如果表 t 裡已經有一個名為 “a” 的 col 呢? 那麼「b」應該是 42 + 1,還是應該是 col “a” + 1 呢?
DuckDB 目前的規則是以 table 的 col 優先級比較高。
這是一個非常方便的功能。DuckDB、Snowflake、Databricks 和 AWS Redshift 都支持它。
趕快到 DuckDB WASM 或 Colab 試試看吧!