如何在sql查询中合并动态列名

时间:2016-07-25 18:30:17

标签: sql oracle plsql

我有一张表,其中有列 第1周,第2周,第3周等。

我有一个存储过程,根据数字输入,我想选择该列。

例如,如果输入为4,那么我想进行查询,

select * 
from table_name 
where Week4=<something>

除了使用动态查询之外,有没有办法做到这一点?因为这个动态的东西只是一个巨大的查询的一小部分。

2 个答案:

答案 0 :(得分:0)

关于规范化的评论是正确的,但如果你别无选择,你可以使用&#34;或&#34;子句:

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)

如果表格是任何大小的话,这将非常慢,因为您不会使用任何索引。除非您完全无法更改表格结构,否则我不建议这样做。

答案 1 :(得分:0)

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

您只需编写一个程序并在其中保留字段名称。假设命名标准相同,那么输入值将是周#(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';