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

Posted

技术标签:

【中文标题】SQL 查询中的“CASE”不适用于字符串值【英文标题】:"CASE" in SQL Query not work with string values 【发布时间】:2019-03-28 16:35:09 【问题描述】:

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

它工作正常:

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

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

【问题讨论】:

【参考方案1】:

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 时,双引号才有效。提出的查询中都存在这两个问题。

【讨论】:

我怀疑 OP 想要字符串 'Free'"Free" 将被解释为列名。 无效的列名错误表明 QUOTED_IDENTIFIER 已打开。如果是这样,字符串文字必须是单引号。 这取决于quoted_identifier 的设置。但为了安全起见,我将只编辑答案以使用单引号。【参考方案2】:

你有两个问题。

SQL 字符串通常用' 括起来,而不是"(MS Access 是一个使用 " 的示例,但 SQL 标准是 ',包括 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 中这样做。您应该在报告中执行此操作(或您拥有的任何表示层)

【讨论】:

以上是关于SQL 查询中的“CASE”不适用于字符串值的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:表值函数不适用于子查询

瑞典语标志不适用于 SQL 查询

SQL case 语句不适用于多参数 pentaho cde

用于检查值是不是在列表中的逻辑不适用于 set

SELECT 和 WHERE 中的 SQL CASE 用于选择行

sql查询中case语句中的布尔值