Sam R.
Sam R.

Reputation: 49

Using column value as column name in subquery

I'm working with a legacy DB that has a table that houses field names from other tables.

So I have this structure:

Field_ID | Field_Name
*********************
1 | Col1  
2 | Col2  
3 | Col3  
4 | Col4  

and I need to pull a list of this field metadata along with the values of that field for a given user. So I need:

Field_ID | Field_Name | Value  
1 | Col1 | ValueOfCol1onADiffTable  
2 | Col2 | ValueOfCol2onADiffTable  
3 | Col3 | ValueOfCol3onADiffTable  
4 | Col4 | ValueOfCol4onADiffTable  

I'd like to use the Field_Name in a subquery to pull that value, but can't figure out how to get SQL to evaluate Field_Name as a column in the sub-query.

So something like this:

select
        Field_ID
      ,Field_Name
      ,(SELECT f.Field_Name from tblUsers u 
    where u.User_ID = @userId) as value
from 
  dbo.tblFields f 

But that just returns Field_Name in the values column, not the value of it.

Do I need to put the sub-query in a separate function and evaluate that? Or some kind of dynamic SQL?

Upvotes: 2

Views: 3041

Answers (1)

DhruvJoshi
DhruvJoshi

Reputation: 17146

In SQL server this would require dynamic SQL and UNPIVOT notation. see working demo

create table tblFields (Field_ID int ,Field_Name varchar(10));
insert into tblFields values
(1,'Col1')
,(2,'Col2')
,(3,'Col3')
,(4,'Col4');
declare @userId int
set @userId=1

create table tblUsers (User_ID int, col1 varchar(10),col2 varchar(10));
insert into tblUsers values
(1, 10,100),
(2,20,200);

declare @collist varchar(max)
declare @sqlquery varchar(max)

select @collist= COALESCE(@collist + ', ', '') + Field_Name
from dbo.tblFields
where exists (
       select * from sys.columns c join sys.tables t 
       on c.object_id=t.object_id and t.name='tblUsers'
       and c.name =Field_Name)
select @sqlquery=
' select Field_ID ,Field_Name, value '+
' from dbo.tblFields f  Join '+
' ( select  * from '+
'( select * '+
' from tblUsers u '+
' where u.User_ID = '+ cast(@userId as varchar(max)) +
' ) src '+
'unpivot ( Value for field in ('+ @collist+')) up )t'+
' on t.field =Field_Name'
exec(@sqlquery)

Upvotes: 2

Related Questions