【问题标题】:SQL Server CASE Conversion failedSQL Server CASE 转换失败
【发布时间】:2014-01-17 11:13:20
【问题描述】:

我在使用CASE 语句时遇到了一些问题,因为将值从VARCHAR 转换为INT 时出现错误。我知道这是由于优先级限制,要修复我需要CONVERT/CAST 我的值之一,我无法确定要转换哪个值。

这个original post 把我推向了正确的方向,只是敲了敲我的脑袋想办法。

UPDATE  Table1
SET     IntField = ( CASE WHEN ( VARCHARField = 0
                             OR VARCHARField = 1
                             OR VARCHARField = 2
                             OR VARCHARField = 3
                           ) THEN 0
                      WHEN ( VARCHARField = 4
                             OR VARCHARField = 5
                             OR VARCHARField = 6
                             OR VARCHARField = 7
                           ) THEN 1
                      WHEN ( VARCHARField = 8
                             OR VARCHARField = 9
                           ) THEN 2
                      WHEN ( VARCHARField = 'N' ) THEN 3
                      ELSE 0
                 END )

错误:

消息 245,第 16 级,状态 1,第 1 行
将 varchar 值“N”转换为数据类型 int 时转换失败。

任何帮助将不胜感激。

【问题讨论】:

  • 您为什么不进行这样的比较:WHEN (VARCHARField = '0' OR VARCHARField = '1' ...VARCHARField,嗯,VARCHAR
  • 谢谢@EfrainReyes - 这就是问题所在。

标签: sql sql-server tsql sql-server-2012 case


【解决方案1】:

这与case 无关。这是比较。您关心将字符字段与整数进行比较。也许你的意思是:

CASE 
    WHEN VARCHARField in ('0', '1', '2', '3') THEN 0
    WHEN VARCHARField in ('4', '5', '6', '7') THEN 1
    WHEN VARCHARField in ('8', '9') THEN 2
    WHEN VARCHARField = 'N' THEN 3
    ELSE 0
END

虽然从错误信息的实质来看,我猜VARCHARField实际上是存储为数值的。

【讨论】:

  • 感谢你们俩 - 我很简单地忽略了单引号中没有值!添加了这些,效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
相关资源
最近更新 更多