SQL Server中COALESCE首列含<>条件判断的报错解决求助
解决SQL Server中COALESCE搭配布尔表达式的报错问题
报错原因
SQL Server不允许将布尔值直接作为COALESCE的参数。x.START_DATE <> x.prv_plus1返回的是布尔逻辑值,而COALESCE要求所有参数必须是可转换为统一数据类型的标量值,布尔类型无法与0(int类型)自动兼容,因此触发类型不匹配错误。
修正方案
方案1:使用CASE表达式替代COALESCE
CASE表达式可直接处理布尔判断并返回指定数值,同时自然覆盖NULL场景:
select *, CASE WHEN x.START_DATE <> x.prv_plus1 THEN 1 ELSE 0 END AS IsNotConsecutive from ( SELECT EMP_ID, [START_DATE], [END_DATE], DATEADD(DAY, 1, LAG([END_DATE]) OVER (PARTITION BY EMP_ID ORDER BY START_DATE)) as prv_plus1 FROM dbo.EMP_ABSENCE_DTLS ) x;
方案2:将布尔表达式转换为BIT类型后使用COALESCE
通过CAST把布尔结果转为SQL Server支持的BIT类型,再与0(会自动转为BIT)搭配COALESCE:
select *, COALESCE(CAST(x.START_DATE <> x.prv_plus1 AS BIT), 0) AS IsNotConsecutive from ( SELECT EMP_ID, [START_DATE], [END_DATE], DATEADD(DAY, 1, LAG([END_DATE]) OVER (PARTITION BY EMP_ID ORDER BY START_DATE)) as prv_plus1 FROM dbo.EMP_ABSENCE_DTLS ) x;
说明
两种方案均能实现需求:当START_DATE不等于prv_plus1时返回1,否则(包括prv_plus1为NULL的员工第一条缺勤记录)返回0。
内容的提问来源于stack exchange,提问作者Sunil Kumar Patro
相关产品推荐
相关产品推荐

