T-SQL使用数字检查返回CASE中的文本

时间:2014-10-01 07:54:31

标签: sql-server case

当我这样做时:

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语句中进行数字检查后是否可以返回文本值?

谢谢!

ķ。

2 个答案:

答案 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