为什么我的CASE语句要求THEN部分是INT数据类型?

时间:2015-08-17 11:29:07

标签: sql-server

我正在尝试运行查询,其中下面的CASE语句是其中一行。我正在使用Report Builder 3.0。

但是,我收到一条错误消息:

  

将varchar值'Case 1'转换为数据类型int时转换失败; Microsoft SQL Server,错误:245“。

为什么CASE语句要求THEN部分是INT数据类型?

  (CASE
            WHEN    jobs.Uf_Production_Line = 'LN BM6'
                    THEN 'Case 1'
            ELSE

            99999
        END
    ) AS line

5 个答案:

答案 0 :(得分:5)

使用CASE语句时,所有结果表达式必须具有相同的数据类型。如果不是,则结果将转换为具有更高优先级的数据类型。根据{{​​3}}

  

从中输入类型集中的最高优先级类型   result_expressions和可选的else_result_expression。

由于INT的{​​{3}}高于VARCHAR,因此您的查询会产生错误:

  

将varchar值'Case 1'转换为数据时转换失败   type int; Microsoft SQL Server,错误:245“。

要解决此问题,您应该将ELSE部分转换为VARCHAR

ELSE '99999'

答案 1 :(得分:3)

由于您的else使用数据类型为int的值:

ELSE 99999

您使用无法自动交换的数据类型(varcharint)。

选项是使用:

ELSE '99999'

答案 2 :(得分:0)

case语句只能返回一种数据类型。所以使用数字作为varchar:

(CASE WHEN jobs.Uf_Production_Line = 'LN BM6'
          THEN 'Case 1'
      ELSE '99999'
      END
) AS line

如果您想将其表示为NULL的无效值,则可以返回Line而不是9999:

(CASE WHEN jobs.Uf_Production_Line = 'LN BM6'
          THEN 'Case 1'
      ELSE NULL
      END
) AS line

答案 3 :(得分:0)

因为 99999 int。两种情况都必须返回相同的数据类型。

答案 4 :(得分:0)

您应该使用'99999'代替99999CASE中的所有值都应该是相同的数据类型,现在ELSE部分值为INT数据类型。

完整代码应该是:

    (CASE WHEN jobs.Uf_Production_Line = 'LN BM6' THEN 'Case 1'
          ELSE '99999'
     END
    ) AS line