SQL查询中的“ CASE”不适用于字符串值

时间:2019-03-28 16:35:09

标签: sql sql-server sql-server-2014

我有简单的“ Case”查询,该查询可以使用数字,但不能使用字符串?

工作正常:

SELECT
OrderItem_ID,Cost,
Case
    When Cost = 0 then 555
    Else Cost
End As CostStatus
FROM
    OrderItem

它不起作用:

    SELECT
    OrderItem_ID,Cost,
    Case
        When Cost = 0 then "Free"
        Else Cost
    End As CostStatus
    FROM
        OrderItem

错误是: 无效的列名“免费”。

2 个答案:

答案 0 :(得分:2)

CASE表达式的所有结果应返回相同的数据类型,或者需要按照数据优先级进行隐式转换。在这种情况下,数字类型的优先级高于字符串数据类型。因此,您需要使用显式转换。

SELECT
OrderItem_ID,Cost,
Case
    When Cost = 0 then 'Free'
    Else CAST( Cost AS varchar(13))
End As CostStatus
FROM
    OrderItem

编辑:我将双引号更改为单引号,这是T-SQL中的标准。仅当QUOTED_IDENTIFIERS为OFF时,双引号才有效。这两个问题都出现在查询中。

答案 1 :(得分:0)

您有两个问题。

SQL字符串通常用'而不是"括起来。 (MS Access是使用",但SQL Standard是'(包括SQL Server的示例)

这给你这个...

SELECT
OrderItem_ID,Cost,
Case
    When Cost = 0 then 'Free'
    Else Cost
End As CostStatus
FROM
    OrderItem

但是随后您尝试将字符串({'free'与一堆数字放在同一列:costStatus

您希望该列是字符串列还是数字列? 不能 都是...

也许您应该有两列?您已经拥有cost列了,所以也许'free''not free'是两个可能的状态值?

SELECT
OrderItem_ID,
Cost,
Case
    When Cost = 0 then 'Free'
    Else 'Not Free'
End As CostStatus
FROM
    OrderItem

如果只是这样,您可以用单词0.00替换报告中的free,则不要在SQL中这样做。您应该在报告(或您拥有的任何表示层)中完成该操作。