当我这样做时:
select
'Result' =
case
when my_table.value > 0
then 'Correct'
else 'Not Correct'
end
from table as my_table
它总是返回这样的东西:
Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'Correct' to data type int.
我怎样才能做到这一点?在CASE语句中进行数字检查后是否可以返回文本值?
谢谢!
ķ。
答案 0 :(得分:3)
您的语法在技术上没有任何问题,您的查询可以通过以下方式轻松复制:
SELECT 'Result' = CASE WHEN my_table.value > 0 THEN 'Correct'
ELSE 'Not Correct'
END
FROM (VALUES (1), (0)) My_Table (Value);
工作正常。只要所有返回类型相同,或者可以隐式转换为具有最高优先级的数据类型,例如,您可以执行任何您喜欢的检查。这仍然有效:
SELECT 'Result' = CASE WHEN my_table.value > 0 THEN 1 -- INTEGER/INTEGER
WHEN 'Test' = 'Test2' THEN 0.5 -- TEXT/DECIMAL
ELSE '0' --/TEXT
END
FROM (VALUES (1), (0)) My_Table (Value);
评论显示Expresson Type/Return Type
。我怀疑实际问题来自您尚未发布的UNION,或者您未发布的案例表达式中的其他表达式。
例如,虽然顶部部分在上面运行良好,但运行:
SELECT 'Result' = CASE WHEN my_table.value > 0 THEN 'Correct'
ELSE 'Not Correct'
END
FROM (VALUES (1), (0)) My_Table (Value)
UNION ALL
SELECT 1;
会出现以下错误:
将varchar值'Correct'转换为数据类型int时转换失败。
顺便说一句,我建议不要使用文字作为列别名,但是,它在弃用列表中,但IMO也会让人感到困惑,特别是在这种情况下,当与实际的字符串结合使用时文字。
答案 1 :(得分:0)
它失败,因为my_table.Value具有不同的数据类型。试试这个
;with t
As
(
select
'Result' =
case
when my_table.value > 0
then 1
else 0
end
from table as my_table
)
select CASE WHEN t.Result = 1 then 'CORRECT' ELSE 'WRONG' END FROM t
OR
;with t
As
(
SELECT CASE WHEN my_table.value > 1 THEN 1 ELSE 0 END as Result FROM dbo.my_table
)
select CASE WHEN t.Result = 1 then 'CORRECT' ELSE 'WRONG' END FROM t