6

我有 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 [selected-columns] from table_levels where nwlevel = '1')
from table_results

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

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

select start_date, end_date, contract
from table_results
4

3 回答 3

9

我之前的回答是针对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)

sql server 演示


上一个答案。效劳于mssql

mysql 的演示

用于GROUP_CONCAT从 in 中的值生成一个字符串,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;
于 2013-09-09T16:18:39.630 回答
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)
于 2013-09-10T09:03:24.560 回答
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
于 2013-09-09T17:17:03.690 回答