如何在SQL查询中包含动态列名称
我有一个表格,其中有列,比如说 第1周,第2周,第3周等。如何在SQL查询中包含动态列名称
我有一个存储过程,并基于数字输入,我想选择该列。
例如,如果输入的是4,然后我想使查询,
select *
from table_name
where Week4=<something>
有什么方法比使用动态查询做到这一点其他的?因为这个动态的东西只是一个巨大查询的一小部分。
关于规范化的意见是正确的,但如果你没有选择,你可以使用“或”条款:
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)
这将是,如果表是任何尺寸的,因为你不会很慢不要使用任何索引。除非你完全无法改变表格结构,否则我不会建议这样做。
为什么要显示Oracle问题的SQL-Server语法? – OldProgrammer
我的不好;我错过了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';
可以更改数据库?如果你有一个正确的规范化的数据库模型,这是没有必要的。 –
@a_horse_with_no_name **正确**。数据库在2年后投入生产时会发生什么?你有104列。 3年 - 156列。这真的是非常糟糕的设计。如果即使是远程可能的,你也应该规范化。 –