根据另一个表中的列名从一个表中选择列

时间:2013-09-09 15:52:58

标签: sql sql-server-2008

我有2个表,一个包含我需要的最终结果,另一个包含我需要根据设置级别选择的列列表。

例如:

table_levels

level | name      | [selected-columns]
1     | startdate | start_date
1     | end date  | end_date
1     | contract  | contract

所以,如果我做以下

select column from table_levels where level = '1'

然后基本上我需要使用这个select语句中的列名来确定从另一个语句中选择哪些列。

这是我尝试过的,当然我知道它的错误但是让你知道我想做什么。

select (select [selected-columns] from table_levels where nwlevel = '1')
from table_results

在某种程度上我试图动态构建一个sql查询,可以通过我放在table_levels表中的任何列来改变它。

理论上这应该与以下sql查询相同

select start_date, end_date, contract
from table_results

3 个答案:

答案 0 :(得分:4)

我以前的回答是针对mysql的。由于此后标记已针对该问题进行了更新,因此以下是sql-server-2008的查询。

根据table_levels中的值构建列的列表,删除最后的,,构建查询字符串以从table_results获取结果,然后执行。

DECLARE @listStr varchar(MAX) = ( select selectColumnName + ',' from table_levels where level = 1 for xml path(''))
DECLARE @query varchar(MAX) = 'SELECT ' + LEFT(@listStr, LEN(@listStr)-1) + ' FROM table_results'
execute(@query)

Demo for sql server


以前的答案。适用于mssql

请参阅demo for mysql

使用GROUP_CONCATtable_levels中的值中创建一个字符串,然后构建一个查询字符串,以便从table_results

获取结果
SET @listStr = ( SELECT GROUP_CONCAT(selectColumnName) FROM table_levels where level = 1);
SET @query := CONCAT('SELECT ', @listStr, ' FROM table_results');
PREPARE STMT FROM @query;
EXECUTE STMT;

答案 1 :(得分:0)

declare @cmd varchar(max)
select @cmd=''
select @cmd=@cmd+','+[selected-columns]
from table_levels
where level=1
if len(@cmd)>0
begin
    select @cmd='select '+substring(@cmd,2,len(@cmd))+' from table_result'
    exec(@cmd)
end

答案 2 :(得分:0)

我做了一些工作,做了@lobo稍微改变的说法。

DECLARE @listStr varchar(MAX);
set @liststr =
        (
select [column] + ',' from dbo.columns where nwlevel = '1' for xml path('')
        )

DECLARE @query varchar(MAX);
set @query =
        (
        'SELECT ' + LEFT(@listStr, LEN(@listStr)-1) + ' FROM staff'
        )
execute(@query)