关于 case when then end 过滤列数据的查询

本文介绍了一种在SQL中将地址字段(包括省份、城市、区县及详细街道)拼接成完整地址的方法。特别针对当城市字段为“市辖区”或“县”时的特殊处理,提供适用于不同数据库(如SQL Server、Oracle、Access和MySQL)的解决方案。

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

 

当我要查询一个地址簿信息的时候,碰到了详细地址在数据库中由省、市、县以及详细街道组成,需要将其连接为一个字段,此时将多列用 +  号连接即可,但此时出现地址如:“北京市 市辖区 东城区 **街道”,但实际上我们想显示的是“北京市 东城区 **街道,所有必须当碰到市级出现“市辖区”或者“县”时,则过滤为空“” ,于是,SQL语句应写为:

 

select b.id,b.name,(p.ProvinceName+ (case when  c.CityName ='市辖区' then ''
when  c.CityName ='县' then ''  end)+
cu.CountyName+b.detailAddress) as detailAddress,
b.companyName,b.postcode,b.mobilePhone,b.companyPhone,b.otherPhone,b.email,b.qq,b.remark
from Book b, Province p, City c, County cu
where p.ProvinceID= b.provinceId and c.CityID= b.cityId and cu.CountyID = b.countyId

 

 

注意,上面的语句只适应于SQL server  、 orcal 等,而小型的Access、MySQL却不能识别 case when then end  关键字,所有在使用此类小型数据库的时候必须作如下更改,得到相同效果

 


select b.id, b.name,
(p.ProvinceName + (iif(c.CityName='市辖区' or c.CityName='县','',c.CityName))
+ cu.CountyName + b.detailAddress) as detailAddress,
 b.companyName,b.postcode,b.mobilePhone,b.otherPhone,b.email,b.qq,b.remark
from Book b, Province p, City c, County cu 
where p.ProvinceID = b.provinceId and c.CityID = b.cityId and cu.CountyID = b.countyId

 

------------------------------------------------------------------------------------------------------------

 

IIf   函数   
         
  取决于表达式的计算结果,返回两部分之一。  
   
  语法  
   
  IIf(expr,   truepart,   falsepart)  
   
  IIf   函数语法具有以下命名参数:  
   
  部分   说明    
  expr   必选。要计算的表达式。    
  truepart   必选。在   expr   为   True   时返回的值或表达式。    
  falsepart   必选。在   expr   为   False   时返回的值或表达式。    
   
   
  说明  
   
  IIf   总是同时计算   truepart   和   falsepart,即使只返回这两者之一。因此,应注意意外的副作用。例如,如果计算   falsepart   会导至除以零的错误,则即使   expr   为   True,也会发生错误。

### SQL 中 `CASE WHEN THEN ELSE END` 结合嵌套子查询的语法 在 SQL 查询中,`CASE WHEN THEN ELSE END` 可以用来实现基于条件逻辑的数据处理。当它与嵌套子查询结合时,可以通过复杂的业务逻辑动态生成结果集。 以下是具体的语法结构以及示例: #### 语法说明 ```sql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... WHEN conditionN THEN resultN ELSE default_result END ``` 其中,`conditionX` 是布尔表达式,通常涉及字段值或其他计算结果。而这些条件也可以通过子查询获取其值。 --- #### 示例:使用 `CASE WHEN THEN ELSE END` 和嵌套子查询 假设有一个场景:我们需要根据订单状态 (`orders.status`) 来决定用户的标签 (`users.label`),并将其显示出来。具体需求如下: - 如果用户有已完成的订单,则标记为 `"VIP"`; - 如果用户没有任何完成的订单,则标记为 `"Regular User"`。 数据库表结构如下: - 表 `users`: 包含字段 `id`, `name` - 表 `orders`: 包含字段 `user_id`, `status` ##### 查询语句 ```sql SELECT u.id, u.name, CASE WHEN EXISTS ( SELECT 1 FROM orders o WHERE o.user_id = u.id AND o.status = 'completed' ) THEN 'VIP' ELSE 'Regular User' END AS label FROM users u; ``` 在此查询中: - 使用了 `EXISTS` 子查询来判断是否存在符合条件的记录[^5]。 - 将子查询的结果作为 `CASE` 的条件之一,从而实现了复杂逻辑下的分类操作。 --- #### 更高级的例子:多层嵌套子查询 如果需要更复杂的逻辑,比如根据多个条件组合进行分类,可以进一步扩展 `CASE` 语句中的子查询层次。例如: ##### 需求描述 - 用户在过去一年中有超过 5 笔已完成订单 -> 标记为 `"Gold VIP"` - 用户过去一年内完成了至少一笔订单 -> 标记为 `"Silver VIP"` - 否则 -> 标记为 `"Normal"` ##### 数据库表结构补充 新增时间戳字段 `created_at` 到 `orders` 表中。 ##### 查询语句 ```sql SELECT u.id, u.name, CASE WHEN (SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id AND o.status = 'completed' AND o.created_at >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR)) > 5 THEN 'Gold VIP' WHEN EXISTS ( SELECT 1 FROM orders o WHERE o.user_id = u.id AND o.status = 'completed' AND o.created_at >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR) ) THEN 'Silver VIP' ELSE 'Normal' END AS user_level FROM users u; ``` 此查询展示了如何利用多层次的子查询和日期函数来构建更加精细的分类规则[^3]。 --- ### 注意事项 1. **性能优化**: 复杂的嵌套子查询可能会影响查询效率,在实际应用中应考虑索引设计或改写为 JOIN 形式的查询[^4]。 2. **NULL 值处理**: 当某些条件下返回 NULL 时,需特别注意是否会对最终结果造成影响[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值