Engineering · 1 min read
ClickHouse 陣列與條件函式:has、arrayMap、multiIf
ClickHouse 的 lambda 陣列函式——arrayMap / arrayFilter / arrayExists / arrayAll,加上 has、ifNull、groupArray 以及 if / multiIf 條件式,附分群與延遲篩選的實例。
ClickHouse 對 array 有一整套 lambda 函式,還有自己的 null 預設與條件寫法。
常用
ifNull(x, default)— 給預設值(沒有nvl)has(arr, val)— array 成員判斷(等於array_contains)groupArray()/groupUniqArray()— 把多列聚成 arrayif(c, t, f)/multiIf(...)— 精簡條件式arrayMap()/arrayFilter()/arrayExists()/arrayAll()arrayMap(x -> ..., array)arrayFilter(x -> ..., array)arrayExists(x -> ..., array):等於 Pythonany()arrayAll(x -> ..., arr):等於 Pythonall()
toDate()/formatDateTime()/toStartOfMonth()— 日期處理
if / multiIf
SELECT
user_id,
-- 用 if() 做簡單的二元分類
if(days_active <= 30, 'Active', 'Churned') AS user_status,
-- 用 multiIf() 做多層分級
multiIf(
total_spent >= 5000 AND days_active <= 14, 'VIP_Active',
total_spent >= 5000, 'VIP_At_Risk',
total_spent >= 1000 AND days_active <= 30, 'Loyal_Regular',
total_spent < 1000 AND days_active > 90, 'Dead_Account',
'Standard'
) AS marketing_segment
FROM user_metrics_local;
arrayFilter / arrayExists
arrayFilter 濾掉不符合 lambda 的元素;arrayExists 只要有一個元素符合就回傳 1,像 inline 的 EXISTS subquery。
SELECT
request_id,
-- 只保留延遲超過 500ms 的元素
arrayFilter(
latency -> latency > 500,
microservice_latencies
) AS slow_dependencies
FROM api_gateway_logs
WHERE arrayExists(latency -> latency > 500, microservice_latencies);
參考來源
- ClickHouse Array Functions — https://clickhouse.com/docs/en/sql-reference/functions/array-functions
Related: 回到跨引擎資料庫查詢總覽;另見 ClickHouse 資料型別,以及 Spark 對應版本 Spark 陣列函式與 collect。