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 case 语句不适用于多参数 pentaho cde