我在 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
它产生一个错误:
消息 245,级别 16,状态 1,第 9
行将 nvarchar 值“d”转换为数据类型 int 时转换失败。
我能理解为什么会这样:
因为正在累积(要显示)的数据不能同时附加 int
在string
同一列。
行
但是这个呢:
SELECT 'dummy'
FROM @tbl
WHERE CASE
WHEN isCalcByA = 1 THEN a
ELSE b
END IS NOT NULL
这里 -
- 我总是显示
string
- 我不积累不同类型的不同显示结果。
- 我正在检查它们
not null
而不是 astring
orint
值。
但我仍然得到同样的错误。
我错过了什么?
注意
我知道我可以/应该这样做:
SELECT 'dummy'
FROM @tbl
WHERE
(isCalcByA = 1 AND a IS NOT NULL)
OR
(isCalcByA <> 1 AND b IS NOT NULL)
(效果很好)
但我问为什么它在第一种CASE
情况下不起作用