【原】關於資料倉儲中複雜報表SQL語句的寫法

bq_wang發表於2008-04-02

 

在資料倉儲的基本報表製作過程中,通常會使用SQL作為資料來源,可是普通的SQL實在不適合處理一些較為複雜的邏輯判斷;一般而言,待查詢的資料型別主要包括日期型、數字型、字串這三類資料型別;在報表查詢介面前段,實際上會對查詢的資料作一些預設處理,例如有些欄位可輸可不輸,輸入的欄位需要按照輸入的內容進行查詢,而未輸入的欄位通常會選擇忽略該條件的存在,如何判斷該欄位是否輸入了呢,當然是針對這些未輸入的欄位提供一些預設值了,例如某個數字型別的欄位未輸入,則賦一個預設值-1,某個字串欄位未輸入,則賦一個預設值為’ ‘,某個日期未輸入,則賦一個預設值為SYSDATE;這個時候只要在SQL中針對不同的預設值和應該輸入的值進行處理就OK了。

當然當更加複雜的查詢邏輯實在不適合用SQL處理時,最好選擇使用儲存過程的方法了;其次過於複雜的SQL可能會帶來資料庫效能問題,因此這些基於SQL的報表最好不要在大型資料表上操作。

下面是構造了一個包含以上三種資料型別的資料表,並填充了一些測試資料。

CREATE TABLE TestReportParameter

(

  VarcharField     VARCHAR2(20),

  NumberField      NUMBER(10,0),

  DateField        DATE 

);

 

INSERT INTO TestReportParameter VALUES('a',1,SYSDATE-1);

INSERT INTO TestReportParameter VALUES('b',2,SYSDATE);

INSERT INTO TestReportParameter VALUES('c',3,SYSDATE+2);

INSERT INTO TestReportParameter VALUES('d',4,SYSDATE-2);

COMMIT;

 

處理的秘密在於對預設值和輸入值之間做一個判斷,保持任何一種值的存在為TRUE即可。

對於單值資料的處理比較簡單,參看下面指令碼

SELECT *

  FROM TestReportParameter

 WHERE (' ' = &VarcharField OR VarcharField = &VarcharField)

   AND (-1 = &NumberField OR NumberField = &NumberField)

 

對於多選值的處理則一定要使用DECODE函式才能避免錯誤的發生,處理的邏輯同上。

SELECT *

  FROM TestReportParameter

 WHERE (

         ' '=DECODE(&VarcharField,' ',' ',&VarcharField)

         OR

         VarcharField IN (&VarcharField)

       )

   AND (

         -1=DECODE(&NumberField,-1,-1,&NumberField)

         OR

         NumberField IN (&NumberField)

       )

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-223924/,如需轉載,請註明出處,否則將追究法律責任。

相關文章