2017-05-25 77 views
-1

我有一个名字和年龄的表格。我试图理解case语句的用法,当我尝试执行以下代码时出现错误。它是一种简单的程序,如果它们低于:关于case语句的常规sql

Select age,             
case             
    when age>30 then Name 
    when age<30 then age 
end 
from tblPerson 

为什么会出现错误,将显示以上的人30岁的姓名和年龄:转换为nvarchar值“萨姆”时转换失败数据类型int。

+0

是否因为sql查询产生的列只能显示特定类型的数据?就像我只能在结果列中显示年龄或姓名一样? – TotalGadha

+0

另外:尽管微软无法理解这个想法([叹气](https://connect.microsoft.com/SQLServer/feedback/details/1546816/remove-case-statement-from-transact-sql-documentation)。 ),'case'是_expression_,而不是_statement_。 – HABO

回答

3

名称和年龄不是相同的数据类型。你需要CAST的年龄,以任何数据类型你的名字。

Select age,             
    case             
     when age>30 then Name 
     when age<30 then CAST(age AS VARCHAR(3)) 
    end 
    from tblPerson 
+0

哎呀.. !!这样一个简单的解决方案逃脱了我的想法..谢谢你,先生@SQLChao – TotalGadha

+0

只是一个后续问题。为什么我需要将年龄转换为nvarchar来显示它?我的意思是,显示年龄或名称的列没有用户定义的数据类型。那为什么它选择只显示nvarchar值?是不是因为我之前在我的问题中所说的:“由sql查询产生的列只能显示特定类型的数据??就像我只能在结果列中显示年龄或名称一样?” – TotalGadha

+0

@totalgadha所有列必须具有数据类型。在这种情况下,由于'Name'在case语句中首先尝试执行nvarchar。如果您更改了订单,它会使其成为一个整数。我还会研究SQL Server中的“隐式和显式转换”以进一步了解。 – SQLChao