2016-07-25 9 views
0

私はテーブルがあり、列には Week1、Week2、Week3というように列があります。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タグを見逃しました。私はもはやオラクルの構文を思い出すことはできませんが、 "or"を使って同じアプローチをとると仮定します。それを行うには恐ろしい方法ですが。 –

0

これはあなたが求めていることではないことを認識していますが、これを動的クエリとして実行することによって何を意味するのかを知っている人々を指摘しました。

プロシージャを作成してフィールド名を保持するだけです。命名標準が同じであると仮定すると、入力値は週#(1,2,7,27,123など)になり、フィールド名は直接対応します(Week1、Week2、Week7、Week27、Week123、などそして、あなただけのような何かと思い、それを呼び出す)

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'; 
関連する問題