SQL中的Case When Else End的用法

本文详细解读了Hive中CaseWhenElseEnd语法的使用方法及应用场景,通过具体实例展示了如何利用此语法进行数据更新与查询操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在对hive做优化时遇到了Case When Else End语法,所以就总结一下相关的知识给大家分享一下,

具体的格式如下:

条件判断语句

update:

update table  
set 字段1=case     
    when 条件1 then 值1       
    when 条件2 then 值2      
    else 值3      
    end     
where    ……  

select:

select 字段1, 字段2,       
    case 字段3     
    when 值1 then 新值       
    when 值2 then 新值      
    end as 重新命名字段3的名字       
from table      
where ……      
order by ……   

CASE 可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例如,你可以在 WHERE 子句中使用CASE。 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁首先让我们看一下 
CASE 的语法。在一般的 SELECT 中,其语法如下: 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
SELECT <myColumnSpec> = 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
CASE 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
WHEN <A> THEN <somethingA> 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
WHEN <B> THEN <somethingB> 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
ELSE <somethingE> 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
END 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁在上面的代码中需要用具体的参数代替尖括号中的内容。


具体的用例

用例一:


假设有如下表格,包括Id, Category, Name, Property四个字段。其中,Property1_Value代表相应记录的属性,该字段的初衷是用来动态存储相应的属性值。如果Category是Book, 则存入的是相应Book的Price,如果是Animal,则存入相应动物的年龄。

表:CateogoryDetail

Id          Category           Name                                                     Property1_Value
1           Book                  Journey to the West                                17.8
2            Animal               Dog                                                          4
3           Book                 The Romance of the Three Kingdoms         23.5
4           Animal               Cat                                                            3

现在要解决这样一个问题,创建一个视图,需要有以下5个字段,Id, Category, Name, Age, Price。 (如果是Animal,则相应的Price为NULL,如果是Book,相应的Age为NULL。)

View的SQL语句可以这样写:

SELECT Id, Category, Name, CASE When(Category = 'Animal') Then Property1_Value ELSE NULL END AS Age, CASE When(Category = 'Book') Then Property1_Value ELSE NULL END AS Price

From CateogoryDetail

大功告成。


用例二:

USE pubs 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
SELECT 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title, 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
'Price Range' = 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
FROM titles 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
ORDER BY price 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁这是 
CASE 的典型用法,但是使用 CASE 其实可以做更多的事情。比方说下面的 GROUP BY 子句中的 CASE

 
用例三:


sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
SELECT 'Number of Titles'Count(*
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
FROM titles 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GROUP BY 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 

用例四:


sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁你甚至还可以组合这些选项,添加一个 ORDER BY 子句,如下所示: 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
USE pubs 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
SELECT 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END AS Range, 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
FROM titles 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GROUP BY 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
ORDER BY 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives' 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁注意,为了在 
GROUP BY 块中使用 CASE,查询语句需要在 GROUP BY 块中重复 SELECT 块中的 CASE 块。 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁除了选择自定义字段之外,在很多情况下 
CASE 都非常有用。再深入一步,你还可以得到你以前认为不可能得到的分组排序结果集。


在 PL/SQL 中,`CASE WHEN THEN ELSE END CASE` 语句是一种用于条件判断的结构化控制流语句。它允许根据不同的条件执行不同的操作。该语句有两种形式:**简单 CASE 表达式**和**搜索 CASE 表达式**。 ### 基本语法 #### 简单 CASE 表达式 ```plsql CASE selector WHEN value1 THEN result1 WHEN value2 THEN result2 ... [ELSE default_result] END; ``` - `selector` 是一个表达式,其结果将与各个 `WHEN` 子句中的值进行比较。 - 如果 `selector` 的值等于某个 `WHEN` 子句中的值,则执行对应的 `THEN` 后的结果。 - 如果没有匹配的值,并且存在 `ELSE` 子句,则执行 `ELSE` 后的结果;否则会抛出 `CASE_NOT_FOUND` 异常。 #### 搜索 CASE 表达式 ```plsql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... [ELSE default_result] END; ``` - 不需要指定 `selector`,而是直接评估每个 `WHEN` 子句中的布尔条件。 - 第一个为真的条件决定要执行的 `THEN` 分支。 - 如果所有条件都为假,并且存在 `ELSE` 子句,则执行 `ELSE` 后的结果;否则会抛出 `CASE_NOT_FOUND` 异常。 ### 使用示例 #### 示例 1:简单 CASE 表达式 ```plsql DECLARE grade CHAR(1) := 'B'; message VARCHAR2(50); BEGIN message := CASE grade WHEN 'A' THEN 'Excellent' WHEN 'B' THEN 'Good' WHEN 'C' THEN 'Average' ELSE 'Fail' END; DBMS_OUTPUT.PUT_LINE(message); -- 输出: Good END; ``` #### 示例 2:搜索 CASE 表达式 ```plsql DECLARE score NUMBER := 85; result VARCHAR2(50); BEGIN result := CASE WHEN score >= 90 THEN 'Grade A' WHEN score >= 80 THEN 'Grade B' WHEN score >= 70 THEN 'Grade C' ELSE 'Fail' END; DBMS_OUTPUT.PUT_LINE(result); -- 输出: Grade B END; ``` ### 注意事项 - 在使用 `CASE` 语句时,建议始终包含 `ELSE` 子句以避免触发 `CASE_NOT_FOUND` 异常。 - 如果省略了 `ELSE` 子句并且没有任何条件满足,则会引发 `CASE_NOT_FOUND` 异常[^3]。 ### 异常处理示例 为了捕获 `CASE_NOT_FOUND` 异常,可以在 PL/SQL 块中添加异常处理部分: ```plsql DECLARE p INT := 0; q INT := 0; r INT := 0; BEGIN CASE WHEN p = 1 THEN NULL; -- Action1 WHEN r = 2 THEN NULL; -- Action2 WHEN q > 1 THEN NULL; -- Action3 END CASE; EXCEPTION WHEN CASE_NOT_FOUND THEN DBMS_OUTPUT.PUT_LINE('Trapped: case_not_found'); END; ``` ### 总结 `CASE WHEN THEN ELSE END` 语句提供了灵活的方式来根据不同的条件执行不同的逻辑。通过合理地使用 `CASE` 语句,可以提高代码的可读性和维护性。同时,在编写 `CASE` 语句时,务必考虑异常情况并适当处理以确保程序的健壮性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值