本文介绍条件表达式的基本语法和示例。
日志服务支持如下条件表达式。
| 表达式 | 语法 | 说明 | 支持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
- 查询和分析结果 