Skip to content
All writing Part 06 of 09 · [object Object]
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() — 把多列聚成 array
  • if(c, t, f) / multiIf(...) — 精簡條件式
  • arrayMap() / arrayFilter() / arrayExists() / arrayAll()
    • arrayMap(x -> ..., array)
    • arrayFilter(x -> ..., array)
    • arrayExists(x -> ..., array):等於 Python any()
    • arrayAll(x -> ..., arr):等於 Python all()
  • 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);

參考來源

Related: 回到跨引擎資料庫查詢總覽;另見 ClickHouse 資料型別,以及 Spark 對應版本 Spark 陣列函式與 collect

Tags #clickhouse #sql
// connect

Be brave | Be wise | Be grateful

21 BreakinCode

// elsewhere
LinkedInMedium (lang: en)Youtube
wh:~$William Hung· © 2026 Taipei · GMT+8 · Available for collaboration