如何在SQL查询中包含动态列名称

问题描述:

我有一个表格,其中有列,比如说 第1周,第2周,第3周等。如何在SQL查询中包含动态列名称

我有一个存储过程,并基于数字输入,我想选择该列。

例如,如果输入的是4,然后我想使查询,

select * 
from table_name 
where Week4=<something> 

有什么方法比使用动态查询做到这一点其他的?因为这个动态的东西只是一个巨大查询的一小部分。

+7

可以更改数据库?如果你有一个正确的规范化的数据库模型,这是没有必要的。 –

+5

@a_horse_with_no_name **正确**。数据库在2年后投入生产时会发生什么?你有104列。 3年 - 156列。这真的是非常糟糕的设计。如果即使是远程可能的,你也应该规范化。 –

关于规范化的意见是正确的,但如果你没有选择,你可以使用“或”条款:

declare @inputvalue int; 
set @int = 1; 

select * 
    from <table> 
where (week1 = <something> and @inputvalue = 1) 
    or (week2 = <something> and @inputvalue = 2) 
    or (week3 = <something> and @inputvalue = 3) 
    or (week4 = <something> and @inputvalue = 4) 

这将是,如果表是任何尺寸的,因为你不会很慢不要使用任何索引。除非你完全无法改变表格结构,否则我不会建议这样做。

+0

为什么要显示Oracle问题的SQL-Server语法? – OldProgrammer

+0

我的不好;我错过了Oracle标签。我不再记得Oracle的语法,但我会假设使用“或”的相同方法可以工作。尽管这是一种可怕的方式。 –

我意识到这不是你所要求的,但我想我会指出一些人通过做这个动态查询来找到你的意思。

你只需写一个程序并在那里保存字段名称。假设命名标准是相同的,那么输入值将是#(1,2,7,27,123等)周,并且字段名称将直接对应(第1周,第2周,第7周,第27周,第123周,等)

create or replace procedure myweek(week_in varchar2) 
is 
dyn_sql varchar2(1000); 
begin 
dyn_sql := 'select * from table_name where week'||week_in||' = ''something;'' ' 
execute immediate dyn_sql; 
end; 
/

然后调用它,你只希望做这样的事情:

exec myweek(27); and it would generate the sql: 
select * from table_name where week27 = 'something';