将文本字符串添加到CASE语句

时间:2015-07-24 08:55:00

标签: sql sql-server tsql

我正在使用以下SQL CASE:

SELECT 
BomMast.BomStockCode
, BomMast.BomDescription
, CASE
           WHEN StkItem.AveUCst <= 0 THEN 'ERROR' 
           WHEN StkItem.AveUCst > 0 THEN (StkItem.AveUCst * BomComp.ProductionQty) 
        END AS TotalCost
FROM BomComp
INNER JOIN BomMast
ON BomMast.BomID = BomComp.BomMasterKey
INNER JOIN StkItem
ON StkItem.StockLink = BomComp.ComponentStockLink

但我收到以下消息:

  

Msg 8114,Level 16,State 5,Line 2   将数据类型varchar转换为float时出错。

我是否不允许在CASE声明中添加测试?

谢谢!

3 个答案:

答案 0 :(得分:1)

将您的查询更改为:

SELECT BomMast.BomStockCode
    ,BomMast.BomDescription
    ,CASE 
        WHEN StkItem.AveUCst <= 0
            THEN 'ERROR'
        WHEN StkItem.AveUCst > 0
            THEN CAST((StkItem.AveUCst * BomComp.ProductionQty) AS NVARCHAR(MAX))
        END AS TotalCost
FROM BomComp
INNER JOIN BomMast ON BomMast.BomID = BomComp.BomMasterKey
INNER JOIN StkItem ON StkItem.StockLink = BomComp.ComponentStockLink

要在CASE语句的任一分支中显示的值的数据类型必须相同才能工作。

修改

@underscore_d 的建议之后,我还认为显示NULL而不是消息ERROR然后处理此{{}}会更好。 1}}应用程序级别的值。

因此,您的案例陈述将更改为:

NULL

答案 1 :(得分:0)

您的列TotalCost(任何其他列都不是)可以是类型混合。在第一种情况下,它将是varchar,在第二种情况下,它将是float或类似的东西。这是不可能的。

答案 2 :(得分:0)

是的,文本可以作为case语句的结果使用,任何数据类型都可以使用,但每种情况都必须返回相同的类型,因为结果列必须只有一种类型

您的[TotalCost]列包含有冲突的数据类型。 [StkItem.AveUCst] float 'ERROR'的字面值是 varchar 。如果您打算在结果列中保留基于数字的值的好处,请考虑将'ERROR'替换为SQL关键字NULL