2014-12-05 56 views
1

有无查询,如:如何在表中选择对每列不同的数据

declare @type int = 1 

select cf.id, cf.name 
from dbo.tbl1 cf 
inner join dbo.tbl2 ct on cf.id = ct.field_id and ct.[type_id] = @type 

的回应是:

ID NAME 
1 number 
2 city 
4 location 
5 username 

我要加入响应的一个领域,我必须让从选择的每个名称 类似:

when name = number then select number from myTbl 
when name = city then select name from region_tbl 
when name = location then select name from location_tbl 
when name = username then select user from user_tbl 

和响应必须像:

ID NAME  Field 
1 number  1   
2 city  Paris 
4 location some_location 
5 username admin 

是否有可能做这样的事情?

或者我可以在表中添加一个多列和响应将是这样的:

ID NAME  command 
1 number select number from myTbl 
2 city  select name from region_tbl 
4 location select name from location_tbl 
5 username select user from user_tbl 

,并动态执行命令,反应必须是这样的:

ID NAME  command 
1 number  1   
2 city  Paris 
4 location some_location 
5 username admin 
+0

您可以使用'CASE和子查询'并获得所需的输出 – 2014-12-05 08:39:25

回答

2

可以使用CASE WHEN THEN使用子查询获得所需结果

如果您的数据类型对于每个表列,那么你可能有子查询结果转换为一个统一的类型像VARCHAR

select cf.id, cf.name 
    thirdColumn = CASE 
        WHEN cf.name = 'number' THEN CAST((select TOP 1 number from myTbl) AS VARCHAR) 
        WHEN cf.name = 'city' THEN CAST((select TOP 1 name from region_tbl) AS VARCHAR) 
        WHEN cf.name = 'location' THEN CAST((select TOP 1 name from location_tbl) AS VARCHAR) 
        WHEN cf.name = 'username' THEN CAST((select TOP 1 user from user_tbl) AS VARCHAR) 
    from dbo.tbl1 cf 
    inner join dbo.tbl2 ct on cf.id = ct.field_id and ct.[type_id] = @type 

注 -子查询,而无需使用TOPWHERE情况可能会导致你给多行的作为回报,可以导致错误。所以调整子查询总是返回1行。

相关问题