Azure Databricks中两种CASE语句写法的逻辑差异问询
两种CASE语句的逻辑差异解析
我平时写CASE语句习惯用CASE WHEN column=value THEN result的形式,后来发现有些开发者会用CASE column WHEN value THEN result的写法。在Azure Databricks中测试了以下代码后,得到了不同的结果:
select A.value, CASE A.value WHEN NULL THEN CAST('N' AS VARCHAR(1)) ELSE CAST( A.value AS VARCHAR(1)) END AS CASE_TYPE_1, CASE WHEN A.value IS NULL THEN CAST('N' AS VARCHAR(1)) ELSE CAST( A.value AS VARCHAR(1)) END AS CASE_TYPE_2 from A AS A
测试结果:
A.value CASE_TYPE_1 CASE_TYPE_2 NULL NULL N
这两种CASE语句分别是简单CASE表达式和搜索CASE表达式,核心逻辑差异主要体现在以下两点:
比较逻辑不同
- 简单CASE表达式(
CASE column WHEN value THEN ...):本质是执行column = value的等值比较,匹配第一个满足条件的分支。 - 搜索CASE表达式(
CASE WHEN condition THEN ...):支持自定义任意判断条件,不仅限于等值比较,可使用IS NULL、>、<、BETWEEN等多种逻辑判断。
- 简单CASE表达式(
NULL值处理的关键区别
SQL中NULL代表未知值,所有涉及NULL的等值比较(= NULL)结果都是UNKNOWN,不会被判定为TRUE。所以在测试中:- CASE_TYPE_1(简单CASE)执行
A.value = NULL,比较结果为UNKNOWN,无法匹配WHEN分支,因此走到ELSE返回CAST(A.value AS VARCHAR(1)),也就是NULL。 - CASE_TYPE_2(搜索CASE)使用
A.value IS NULL,这是SQL专门用于判断NULL的语法,当A.value为NULL时条件结果为TRUE,因此匹配WHEN分支返回'N'。
- CASE_TYPE_1(简单CASE)执行
另外,简单CASE表达式只能针对单一列做等值匹配,而搜索CASE表达式灵活性更高,可以针对不同列写不同判断条件,比如:
CASE WHEN col1 > 10 THEN '大于10' WHEN col2 LIKE 'A%' THEN '以A开头' ELSE '其他' END
内容的提问来源于stack exchange,提问作者Win Wongsawatdichart
相关产品推荐
相关产品推荐

