本文介紹條件表達式的基本語法和示例。
日志服務支持如下條件表達式。
表達式 | 語法 | 說明 | 支持SQL | 支持SPL |
CASE WHEN condition1 THEN result1 [WHEN condition2 THEN result2] [ELSE result3] END | 通過條件判斷,對數據進行歸類。 | √ | √ | |
IF(condition, result1) | 如果condition為true,則返回result1,否則返回null。 | √ | √ | |
IF(condition, result1, result2) | 如果condition為true,則返回result1,否則返回result2。 | √ | √ | |
COALESCE(expression1, expression2, expression3...) | 返回多個表達式中第一個非null的值。 | √ | √ | |
NULLIF(expression1, expression2) | 比較兩個表達式的值是否相等。如果相等,則返回null,否則返回第一個表達式的值。 | √ | × | |
TRY(expression) | 捕獲異常信息,使得系統繼續執行查詢和分析操作。 | √ | √ |
CASE WHEN表達式
CASE WHEN表達式用于對數據進行歸類。
語法
CASE WHEN condition1 THEN result1
[WHEN condition2 THEN result2]
[ELSE result3]
END
參數說明
參數 | 說明 |
condition | 條件表達式。 |
result1 | 返回結果。 |
示例
示例1:從http_user_agent字段值中提取瀏覽器信息,歸為Chrome、Safari和unknown三種類型并計算三種類型對應的訪問PV。
查詢和分析語句
* | SELECT CASE WHEN http_user_agent like '%Chrome%' then 'Chrome' WHEN http_user_agent like '%Safari%' then 'Safari' ELSE 'unknown' END AS http_user_agent, count(*) AS pv GROUP BY http_user_agent
查詢和分析結果
示例2:統計不同請求時間的分布情況。
查詢和分析語句
* | SELECT CASE WHEN request_time < 10 then 't10' WHEN request_time < 100 then 't100' WHEN request_time < 1000 then 't1000' WHEN request_time < 10000 then 't10000' ELSE 'large' END AS request_time, count(*) AS pv GROUP BY request_time
查詢和分析結果
IF表達式
IF表達式用于對數據進行歸類,類似于CASE WHEN表達式。
語法
如果condition為true,則返回result1,否則返回null。
IF(condition, result1)
如果condition為true,則返回result1,否則返回result2。
IF(condition, result1, result2)
參數說明
參數 | 說明 |
condition | 條件表達式。 |
result | 返回結果 |
示例
計算狀態碼為200的請求占所有請求的比例。
查詢和分析語句
* | SELECT sum(IF(status = 200, 1, 0)) * 1.0 / count(*) AS status_200_percentag
查詢和分析結果
COALESCE表達式
COALESCE表達式用于返回多個表達式中第一個非null的值。
語法
COALESCE(expression1, expression2, expression3...)
參數說明
參數 | 說明 |
expression | 任何類型的表達式。 |
示例
計算昨天消費金額與上月同一天的比值。
查詢和分析語句
* | SELECT compare("昨天消費金額", 604800) AS diff FROM ( SELECT COALESCE(sum(PretaxAmount), 0) AS "昨天消費金額" FROM log )
查詢和分析結果
6514393413.0表示昨天的消費金額。
19578267596.0表示上月同一天的消費金額。
0.33273594719539659表示昨天與上月同一天的消費金額比值。
NULLIF表達式
NULLIF表達式用于比較兩個表達式的值是否相等。如果相等,則返回null,否則返回第一個表達式的值。
語法
NULLIF(expression1, expression2)
參數說明
參數 | 說明 |
expression | 任何有效的標量表達式。 |
示例
判斷client_ip、host兩個字段的值是否相同。當不相同時,返回client_ip字段的值。
查詢和分析語句
* | SELECT NULLIF(client_ip,host)
查詢和分析結果
TRY表達式
TRY表達式用于捕獲異常信息,使得系統繼續執行查詢和分析操作。
語法
TRY(expression)
參數說明
參數 | 說明 |
expression | 任何類型的表達式。 |
示例
當執行regexp_extract函數發生異常時,try函數會捕獲異常信息并繼續查詢和分析操作,返回查詢和分析結果。
查詢和分析語句
* | SELECT TRY(regexp_extract(request_uri, '.*\/(file.*)', 1)) AS file, count(*) AS count GROUP BY file
查詢和分析結果