T-SQL中case语句的两种写法及区别

本文详细解析了T-SQL中Case语句的两种写法,重点对比了当遇到NULL值时,写法二的必要性和优势。通过具体实例说明了在联合更新操作中,如何正确使用Case语句处理NULL值,避免潜在错误。

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

T-SQL中的case语句相信大家一定不陌生,但是它有2种写法,如下:

写法一:

case 变量
      when 值1 then..
      when 值2 then..
      else ..
end
 
写法二:

case
      when 逻辑表达式 then
      -- true的情况
      else
      -- false的情况
end

 

如果是二叉分支,笔者建议写法二

因为,如果遇到null的情况,则必须使用写法二!!

 

 举个联合更新的例子

场景:把表一中某个日期根据情况更新成加上表二中另外一个日期,如果表二中的日期没有,则

加上默认值1。

如下:

 

1 update a
2  set a.field3 = dateadd(yearcase when b.field2 is null then 1 else b.field2   end, a.field1)
3 from table1 a inner join table2 b
4 on a.ID = b.ID
5 where --other conditions

 

以上该情况,如果使用写法一,null的情况很可能判断不出来!!

 

<think>我们参考了用户提供的引用内容,这些引用主要涉及不同编程语言中`case`语句的语法和使用方法。用户询问的是“case语句的语法规范及使用方法”,并提到“是否可以这样写”,但未具体说明写法。因此,我们需要从通用角度解释case语句的语法规范,并结合引用中的内容进行说明。 引用内容摘要: -引用[1]:讨论了SQL中`CASE WHEN`语句的语法陷阱,区分了表达式和语句的差异。-引用[2]:介绍了Shell脚本中`case`语句的语法结构。 -引用[3]:说明了Java中`switch case`语句的语法规则,特别是关于`break`的重要性。 -引用[4]:展示了SQL中`CASE`语句的简单用法。根据这些引用和用户问题,我们按以下结构回答:1.**case语句的通用概念**:解释case语句在不同语言中的用途(多分支选择)。 2. **不同语言中的语法规范**:分别介绍SQL、Shell、Java中的case语句语法。3.**常见注意事项**:包括break的使用、模式匹配规则等。4.**错误写法示例**:列举常见错误并解释。由于用户没有给出具体的写法,我们将展示正确写法并指出可能的问题。 ###回答结构- **SQL中的CASE语句**(引用[1]和[4]) -**Shell中的case语句**(引用[2]) -**Java中的switchcase语句**(引用[3])- **通用规范与注意事项** 最后,生成相关问题。注意:用户问题中提到的“是否可以这样写”没有具体例子,因此我们只解释正确写法,并提醒常见错误。下面开始组织回答。</think>### CASE语句的语法规范及使用方法 #### 一、SQL中的CASE语句 **语法结构**: ```sql CASE [expression] WHEN value1 THEN result1 WHEN value2 THEN result2 ... ELSE default_result END ``` **使用方法**: 1. **简单CASE表达式**(引用[4]): ```sql SELECT id, CASE department_id WHEN 501 THEN '销售部' WHEN 502 THEN '研发部' ELSE '其他部门' END AS dept_name FROM employees; ``` - 适用于固定字段的条件判断 - 相当于`switch-case`结构[^4] 2. **搜索CASE表达式**(引用[1]): ```sql SELECT name, CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' WHEN score >= 70 THEN 'C' ELSE 'D' END AS grade FROM students; ``` - 支持复杂条件表达式 - 注意陷阱:表达式求值顺序(从上到下,匹配即停止)[^1] #### 二、Shell脚本中的CASE语句(引用[2]) **语法结构**: ```bash case EXPRESSION in PATTERN1) COMMANDS ;; PATTERN2) COMMANDS ;; *) DEFAULT_COMMANDS ;; esac ``` **示例**: ```bash read -p "输入文件类型: " filetype case $filetype in txt|doc) echo "文本文档" ;; jpg|png) echo "图片文件" ;; *) echo "未知类型" ;; esac ``` - 使用`|`分隔多个模式 - 必须用`;;`结束每个分支 - `*)`表示默认分支[^2] #### 三、Java中的switch-case(引用[3]) **语法结构**: ```java switch (expression) { case value1: // 代码块 break; case value2: // 代码块 break; default: // 默认代码 } ``` **关键规则**: 1. **break的重要性**: - 无`break`时会继续执行后续case(穿透现象) - 示例: ```java int day = 2; switch (day) { case 1: System.out.print("Mon"); case 2: System.out.print("Tue"); // 输出Tue case 3: System.out.print("Wed"); // 继续输出Wed } ``` 2. **Java 12+新特性**: ```java switch (day) { case 1, 2, 3 -> System.out.println("工作日"); case 4, 5 -> System.out.println("周末"); default -> System.out.println("无效"); } ``` - 箭头语法避免穿透 - 支持多值匹配[^3] #### 四、通用语法规范 1. **必须包含的要素**: - 起始关键字:`CASE`/`switch`/`case` - 结束标记:`END`/`esac`/`}` - 分支分隔符:`THEN`(SQL)/`;;`(Shell)/`:`(Java) 2. **常见错误写法**: ```sql -- 错误:缺少END CASE WHEN score>90 THEN 'A' -- 错误:缺少分支分隔符 switch (x) { case 1 print("A") } ``` 3. **最佳实践**: - 始终包含`ELSE`/`default`分支 - 在Java中显式使用`break`防止穿透 - 复杂逻辑优先使用搜索式CASE表达式 #### 五、跨语言对比 | 特性 | SQL | Shell | Java | |--------------|--------------|-------------|---------------| | 默认分支 | `ELSE` | `*)` | `default` | | 分支结束符 | 无 | `;;` | `break` | | 多值匹配 | 不支持 | `\|` | `case 1,2:` | | 表达式类型 | 标量值 | 字符串模式 | 整型/枚举/字符串 | > 注:SQLCASE是**表达式**(返回标量值),而Java/Shell的是**语句**(执行代码块)[^1] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值