【问题标题】:SQL CASE statement issueSQL CASE 语句问题
【发布时间】:2015-10-15 07:12:31
【问题描述】:

我在 SQL case 语句中遇到了 else case 的问题。

在我的 SQL 表列中,L_Keyword2 包含以下值并且属于 varchar 类型。

YES,
LAND INCLUDED,
N/APPLICABLE,
3,
1.5,
NO,
4.5+,
OTHER,
NULL,
2,
1,
LAND LEASED,
0,
3.5,
N/A,
OE,
4,
2.5,

当我在 case 语句中使用此列时,如

SELECT 
    L_Keyword2,
    CASE 
       WHEN class LIKE 'RE_1' THEN L_Keyword2 ELSE 0 END
FROM Mytable

此 SQL 查询引发错误:

将 varchar 值“1.5”转换为数据类型 int 时转换失败。

为什么这个 SQL 查询会导致转换错误?即使我没有在其中进行任何转换。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    首先,T-SQL 中的CASE 不是语句——它是一个表达式。因此,它可以从各种WHEN 子句返回的所有值都必须是相同的数据类型,如果不是,则 SQL Server 有一个优先级列表 (see the relevant MSDN documentation for details ) - 在该列表中,int 的范围高于 varchar

    在您的情况下,CASE 显然从ELSE 子句返回int,因此它试图将L_Keyword2 的值(从第一个WHEN ... THEN ... 子句)作为Int 返回也,因此失败了。

    【讨论】:

      【解决方案2】:

      也许是这样的:

      SELECT 
          L_Keyword2,
          CASE 
             WHEN class LIKE 'RE_1' THEN L_Keyword2 ELSE '0' END
      FROM Mytable
      

      如果您想使用LIKE,请输入% 通配符。否则就是简单的比较(WHEN class = 'RE_1')。

      【讨论】:

      • 'RE_1' 中的下划线'_' 是匹配一个字符的通配符。类似于正则表达式中的'.',或DOS/Windows 文件名中的'?'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多