我在我的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
包装到子查询中,以避免复制相同的逻辑