使用CASE语句时出现意外输出

时间:2014-10-28 06:23:09

标签: sql sql-server tsql

当我偶然发现这种情况时,我正在使用case语句尝试一些随机的东西。第一个语句抛出错误,但第二个语句正常。有人可以帮我理解CASE语句的执行。

SELECT CASE WHEN 1 = 1 THEN 'case 1'
            WHEN 2 = 2 THEN 2
            ELSE 10 END

SELECT CASE WHEN 1 = 1 THEN 1
            WHEN 2 = 2 THEN 'case 2'
            ELSE 10 END

3 个答案:

答案 0 :(得分:2)

case语句不能返回多个单一类型。当存在诸如int和varchar之类的混合类型时,int类型具有更高的优先级,因此将是case语句的返回类型的所选类型。有关数据类型优先级列表,请参阅http://msdn.microsoft.com/en-us/library/ms190309.aspx

如果您尝试返回第二个值('case 2'),您的第二个案例陈述将失败;例如:

SELECT case when 1=0 then 1 when 2=2 then 'case 2' else 10 END

答案 1 :(得分:1)

当运算符组合了两种不同数据类型的表达式时,数据类型优先级的规则指定具有较低优先级的数据类型转换为具有较高优先级的数据类型。如果转换不是受支持的隐式转换,则返回错误(MSDN)。

INT 优先级高于varchar,因此会尝试convert'案例1'到int

试试这个你会得到输出

SELECT case when 1=1 then 'case 1' when 2=2 then '2' else '10' END

SELECT case when 1=1 then 1 when 2=2 then 'case 2' else 10 END

了解更多解释check here

表示数据类型优先级check here

答案 2 :(得分:1)

您的所有返回值类型应该相同阅读Here

您还可以在链接中看到另一个讨论优先级的链接,以确定sql将在case语句中使用的类型。在您的情况下,使用的类型是int,因为它具有比文本更高的优先级。

第二个命令有效,因为满足第一个条件。但是如果你尝试将其设为假,如“当1 = 2时选择情况,那么当2 = 2则为1然后'情况2',否则为10结束”。它将与命令1具有相同的错误,因为它将条件2评估为真,返回类型文本违反了类似类型的规则。

简而言之,错误是由于没有相同的

造成的