我在 sql server 中有这个简单的表:
DECLARE @tbl table( a int , b NVARCHAR(100), isCalcByA bit)
INSERT INTO @tbl
SELECT 1,'c',1
UNION ALL
SELECT 2,'d',0
好的。
如果我运行这个:
SELECT CASE
WHEN isCalcByA = 1 THEN a
ELSE b
END FROM @tbl
它产生一个错误:
Msg 245, Level 16, State 1, Line 9
Conversion failed when converting the nvarchar value 'd' to data type int.
我可以理解为什么会发生这种情况:
因为正在累积(待显示)的数据不能在同一列同时附加int
和string
。
好的
但是这个怎么样:
SELECT 'dummy'
FROM @tbl
WHERE CASE
WHEN isCalcByA = 1 THEN a
ELSE b
END IS NOT NULL
这里 -
- 我总是显示
字符串
- 我不会累积不同类型的不同显示结果。
- 我正在检查它们是否为
not null
,而不是string
或int
值。
但我仍然遇到相同错误。
我错过了什么?
注意
我知道我可以/应该这样做:
SELECT 'dummy'
FROM @tbl
WHERE
(isCalcByA = 1 AND a IS NOT NULL)
OR
(isCalcByA <> 1 AND b IS NOT NULL)
(效果很好)
但我问为什么它在第一个 CASE
情况下不起作用
最佳答案
CASE
是一个表达式 - 它返回特定类型的值。它可能返回的所有可能值都必须可转换为某种常见类型。系统使用类型优先规则来考虑所有可能的返回值的类型并决定公共(public)类型是什么。 int
具有更高的优先级并获胜。
CASE
WHEN isCalcByA = 1 THEN CONVERT(nvarchar(100),a)
ELSE b
END
可以工作,因为现在选择的通用类型明确是nvarchar(100)
。
关于sql-server - sql server 中的 CASE - 实现澄清?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19536001/