在SQL中,转换失败的字符串到INT使用CASE



我在我的sql查询中使用情况,如下所示,

SELECT 
         CASE 
            WHEN Grade = 'Diesel' THEN 4
            WHEN Grade = 'Petrol' THEN 5
       END as Grade
      ,sales
  FROM testTableA as tta
  INNER JOIN testTableB ttb on ttb.productid =  tta.Grade

当我在上方运行时,我会得到"Conversion failed when converting the varchar value 'Diesel' to data type int."错误。我也尝试了演员(tta.grade,int(,但没有运气..我在这里做错了什么?

编辑

testTableA : column grade is varchar.
testTableB: column productid is int

给定代码样本,有两种可能性:

  • Grade是一个数字,错误来自case,将值与'Diesel'进行比较。
  • ProductId是一个数字,当Grade的值为'Diesel'时,错误来自on条件。

当然,还有其他可能性,例如表引用确实是视图。

没有足够的信息来确定实际上发生的哪一个。但是,您知道列的数据类型是什么,因此您可以立即确定问题。

如果我不得不猜测,那将是join条件。将productId的东西连接到称为grade的东西是可疑的。

从评论来看,我认为您可能正在寻找:

SELECT 
         CASE 
            WHEN Grade = 'Diesel' THEN 4
            WHEN Grade = 'Petrol' THEN 5
       END as Grade
      ,sales
  FROM testTableA as tta
  INNER JOIN testTableB ttb on ttb.productid =  CASE 
                                                    WHEN tta.Grade = 'Diesel' THEN 4
                                                    WHEN tta.Grade = 'Petrol' THEN 5
                                                 END

您必须返回字符串值,因为Grade具有字符串值&您的ELSE部分也将它们返回&case表达式将仅返回一种类型:

SELECT (CASE WHEN Grade = 'Diesel' THEN '4'
             WHEN Grade = 'Petrol' THEN '5'
             ELSE Grade 
        END) as Grade,
 . . . 

编辑:加入也引起对话问题,因此您必须进行一些对话

SELECT ttb.Grade, sales
FROM testTableA as tta CROSS APPLY
     ( VALUES (CASE WHEN tta.Grade = 'Diesel' THEN 4
                    WHEN tta.Grade = 'Petrol' THEN 5
               END)
     ) tt(grade) INNER JOIN
    testTableB ttb
    ON ttb.productid = tt.Grade;

似乎您想加入案例语句的输出,那么您应该是这样的:

SELECT 
CASE 
    WHEN Grade = 'Diesel' THEN 4
    WHEN Grade = 'Petrol' THEN 5
 END as Grade
,sales
FROM testTableA as tta
INNER JOIN testTableB ttb 
ON ttb.productid =  CASE 
    WHEN tta.Grade = 'Diesel' THEN 4
    WHEN tta.Grade = 'Petrol' THEN 5
END

或将tta包装到子查询中,以避免复制相同的逻辑

最新更新