我有一個表格,其中有列,比如說 第1周,第2周,第3周等。如何在SQL查詢中包含動態列名稱
我有一個存儲過程,並基於數字輸入,我想選擇該列。
例如,如果輸入的是4,然後我想使查詢,
select *
from table_name
where Week4=<something>
有什麼方法比使用動態查詢做到這一點其他的?因爲這個動態的東西只是一個巨大查詢的一小部分。
我有一個表格,其中有列,比如說 第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列。這真的是非常糟糕的設計。如果即使是遠程可能的,你也應該規範化。 –