sql-server - sql server 中的 CASE - 实现澄清?

标签 sql-server sql-server-2008-r2 case

我在 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.

可以理解为什么会发生这种情况:

因为正在累积(待显示)的数据不能在同一列同时附加intstring

好的

但是这个怎么样:

SELECT 'dummy'
FROM   @tbl
WHERE  CASE 
            WHEN isCalcByA = 1 THEN a
            ELSE b
       END IS NOT NULL

这里 -

  • 总是显示字符串
  • 我不会累积不同类型的不同显示结果。
  • 我正在检查它们是否为 not null,而不是 stringint 值。

但我仍然遇到相同错误。

我错过了什么?

注意

我知道我可以/应该这样做:

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/

相关文章:

sql-server - 给定一个字节数组,我如何找出使用了哪种压缩算法?

sql-server - 如何在不使用 SQL Server 中的子查询的情况下连接 GROUP BY 子句中的字符串而无需额外的查询?

sql - 删除 SQL 中的 CONSTRAINT 花费的时间太长

sql - 条件 CASE 语句语法

mysql - 在 SQL 连接语句中添加 case 语句

c# - SQL Server CLR Int64 到 SQLInt64 指定的转换无效

sql - 如何识别连续的工作日期?

mysql - 将超大规模查询从 SQL Server 转换为 MySQL - JOIN 的问题

Makefile(不区分大小写的目标)

Java switch/case 在 case 之后变为默认值