我有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
答案 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)
以前的答案。适用于mssql
使用GROUP_CONCAT
从table_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)