2016-07-25 114 views
0

我有一個表格,其中有列,比如說 第1周,第2周,第3周等。如何在SQL查詢中包含動態列名稱

我有一個存儲過程,並基於數字輸入,我想選擇該列。

例如,如果輸入的是4,然後我想使查詢,

select * 
from table_name 
where Week4=<something> 

有什麼方法比使用動態查詢做到這一點其他的?因爲這個動態的東西只是一個巨大查詢的一小部分。

+7

可以更改數據庫?如果你有一個正確的規範化的數據庫模型,這是沒有必要的。 –

+5

@a_horse_with_no_name **正確**。數據庫在2年後投入生產時會發生什麼?你有104列。 3年 - 156列。這真的是非常糟糕的設計。如果即使是遠程可能的,你也應該規範化。 –

回答

0

關於規範化的意見是正確的,但如果你沒有選擇,你可以使用「或」條款:

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的語法,但我會假設使用「或」的相同方法可以工作。儘管這是一種可怕的方式。 –

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';