跳到主要内容
版本:nightly

CASE

CASE 语句类似于编程语言中的 IF-THEN-ELSE 结构,允许你在查询中执行条件逻辑, 它使你能够根据条件返回特定值,从而使数据检索和操作更加动态。

语法

CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE result
END
  • condition1condition2,...:表达式的判断条件。
  • result1result2,...:满足相应条件时要返回的值。
  • result:当没有条件满足时要返回的值(可选)。

示例

CASE 语句可以在各种子句中使用,例如 SELECTWHEREORDER BYGROUP BY

SELECT 中使用 CASE

SELECT 子句中,你可以使用 CASE 语句根据条件创建新列。 请参阅查询数据指南中的示例

你还可以将 CASESUM 等函数一起使用,以有条件地聚合数据。 例如,你可以计算状态码为 200 和 404 的日志总数:

SELECT
SUM(CASE WHEN status_code = '200' THEN 1 ELSE 0 END) AS status_200_count,
SUM(CASE WHEN status_code = '404' THEN 1 ELSE 0 END) AS status_404_count
FROM nginx_logs;

WHERE 中使用 CASE

WHERE 子句中,你可以根据条件过滤行。 例如,以下查询根据 ts 条件从 monitor 表中检索数据:

SELECT * 
FROM monitor
WHERE host = CASE
WHEN ts > '2023-12-13 02:05:46' THEN '127.0.0.1'
ELSE '127.0.0.2'
END;

GROUP BY 中使用 CASE

CASE 语句可以在 GROUP BY 子句中使用,以根据特定条件对数据进行分类。 例如,以下查询按 host 列分组,并将 cpu 列分类为三类:'high','medium' 和 'low':

SELECT
host,
COUNT(*) AS count,
CASE
WHEN cpu > 0.5 THEN 'high'
WHEN cpu > 0.3 THEN 'medium'
ELSE 'low'
END AS cpu_status
FROM monitor
GROUP BY
host, cpu_status;

ORDER BY 中使用 CASE

根据 GreptimeDB 的数据模型Tag 列拥有索引,可以在 ORDER BY 子句中使用以提高查询性能。 假如 nginx_logs 表中的 status_codehttp_method 列是存储字符串值的 Tag 列, 你可以利用 CASE 语句根据这些列对数据进行排序,如下所示:

SELECT *
FROM nginx_logs
ORDER BY
CASE
WHEN status_code IS NOT NULL THEN status_code
ELSE http_method
END;