TSQL:在SELECT语句中比较日期字段并实现多条件赋值
解决方案:使用CASE表达式实现单SELECT语句的条件分支
完全不需要拆分语句,T-SQL的CASE表达式就是专门用来处理这种在SELECT中根据不同条件返回不同值的场景的。根据你的需求,我们可以按优先级顺序编写条件判断:
- 首先检查
rDatumZavr是否为NULL,返回'nema vneseno' - 然后判断转换为datetime的
rDatum是否大于rDatumZavr,返回'docni' - 最后处理剩下的情况(即
rDatum小于等于rDatumZavr),返回'ne docni'
修改后的完整查询语句
declare @godina as integer = 2020 select vtRokSi.KodSI, vtRokSi.rKod, vtRokSi.rDatum, vtRokSi.rDatumZavr, CASE WHEN vtRokSi.rDatumZavr IS NULL THEN 'nema vneseno' WHEN CONVERT(datetime, vtRokSi.rDatum) > vtRokSi.rDatumZavr THEN 'docni' ELSE 'ne docni' END as docni from GP.dbo.VT_ROK_SI as vtRokSi where vtRokSi.GodGP = @godina
关键说明
- 条件顺序很重要:
CASE是按从上到下的顺序匹配条件的,所以必须先判断rDatumZavr IS NULL——如果rDatumZavr为NULL,后续的比较(>,<=)都会返回UNKNOWN,无法匹配到后面的分支。 - 类型转换:虽然SQL会自动将
date类型的rDatum隐式转换为datetime来和rDatumZavr比较,但显式使用CONVERT或CAST能让代码更清晰,避免潜在的类型转换问题。 - 无需拆分语句:
CASE表达式直接嵌入在SELECT列表中,所有逻辑都在一个查询里完成,效率和可读性都更好。
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

