SQL使用CASE WHEN报错:操作数类型冲突int与date不兼容如何解决
报错根本原因
CASE 表达式要求所有返回分支的数据类型必须兼容,数据库会按照数据类型优先级自动隐式转换所有分支的返回值到优先级最高的类型:
- 原代码第一个分支返回
int类型的数值1,后续分支返回date类型,int的类型优先级高于date,数据库尝试将date值隐式转换为int失败,触发类型冲突报错 - 你后续仅转换后续分支为
nvarchar时,int优先级仍高于nvarchar,数据库会尝试把转换得到的日期字符串转为int,因此触发转换失败报错
解决方案
方案1:输出ETA为date类型
将第一个分支的返回值替换为你业务需要的合法date类型值即可,示例代码如下:
CASE WHEN [AVL] = 1 THEN CAST('1900-01-01' AS DATE) -- 此处替换为你实际需要的日期值 WHEN [DATE_1] IS NOT NULL THEN [DATE_1] WHEN [DATE_2] IS NOT NULL THEN DATEADD(DD, 2, [DATE_2]) END AS [ETA]
方案2:输出ETA为nvarchar类型
将所有分支的返回值统一转换为nvarchar类型,避免隐式转换问题,示例代码如下:
CASE WHEN [AVL] = 1 THEN N'1' -- 返回字符串格式的1,和后续分支类型统一 WHEN [DATE_1] IS NOT NULL THEN CONVERT(NVARCHAR(10), [DATE_1], 23) WHEN [DATE_2] IS NOT NULL THEN CONVERT(NVARCHAR(10), DATEADD(DD, 2, [DATE_2]), 23) END AS [ETA]
内容的提问来源于stack exchange,提问作者Oki Kuswanda
相关产品推荐
相关产品推荐

