0

同じ種類の出力を生成する約 5 つのクエリがありますが、唯一の違いは、Hourly テーブル、Daily テーブル、Weekly テーブルなどの個別のテーブルからデータをフェッチすることです。

ここで、ユーザーの入力に基づいて、5 つのテーブルの 1 つから出力を生成するクエリを作成したいと考えています。例えば

IF THE USER PROVIDED TIMERANGE IS GREATER THAN 1 AND LESS THAN 24 HRS 
  THEN EXTRACT FROM HOURLY TABLE--i.e. execute 1st query 
IF THE USER PROVIDED TIMERANGE IS GREATER THAN 24 AND LESS THAN 7 DAYS
  THEN EXTRACT FROM DAILY TABLE-- i.e. execute 2nd query 

……など

注 : 5 つのクエリはすべて同じタイプの出力を返します。つまり、select 句のプロジェクションはすべてのクエリで同じです。

これは、単一の SQL ステートメント (おそらくユニオンを使用) で実行できますか?それとも、このために PL/SQL を記述する必要がありますか?

4

2 に答える 2

2

UNION ALL 演算子を使用してこれを行うことができます。

select * from hourly_table
where (&&user_end_date - &&user_start_day) < 1
union all
select * from weekly_table
where (&&user_end_date - &&user_start_day) between 1 and 7
union all
select * from monthly_table
where &&user_end_date <= add_months(&&user_start_day, 1)
union all
select * from yearly_table
where &&user_end_date <= add_months(&&user_start_day, 12)
union all
select * from whatever_table
where &&user_end_date > add_months(&&user_start_day, 12)

置換変数に SQL*Plus 構文を使用しました。クエリの実行に使用しているクライアントに合わせて、これを変更する必要がある場合があります。

于 2012-08-02T08:46:43.120 に答える
0

ケース..いつ役立つかもしれない

select 
CASE ConditionVar
  WHEN Val1 THEN Query1 
  WHEN Val2 THeN Query2
  ELSE QUERY3
END as myresult
from my_tables (dual in case no need of table);

ケースの詳細な説明 http://www.techonthenet.com/oracle/functions/case.php

代替構文、これはあなたの場合により役立つかもしれません

select 
CASE 
   WHEN condition1 THEN Query1 
   WHEN condition2 THeN Query2
   ELSE QUERY3
END as myresult
from my_tables (dual in case no need of table);
于 2012-08-02T08:48:54.777 に答える