我正在使用以下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声明中添加测试?
谢谢!
答案 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
。