2012-03-30 126 views
0

我當前的表結構是12列,每個表示月份。基於sysdate的更新列

我需要根據sysdate動態選擇要更新的列。

用於更新用在一月完成,查詢應該是這樣的: -

UPDATE report SET jan VALUE = 'blabla' 

,並在12月做更新用,查詢應該是這樣的: -

UPDATE report SET dec VALUE = 'blabla' 

有什麼辦法簡化這一點。也許到這樣的事情: -

UPDATE report SET curMonth() VALUE = 'blabla' 
+0

什麼味道的數據庫是這樣嗎? – cctan 2012-03-30 04:06:16

+2

我必須列 - 值和日期。如果你想得到12列結果,按月分解 - 使用PIVOT查詢。 – 2012-03-30 04:06:23

回答

1

有12列有12個月的名稱的表是一個貧窮的設計 - 它違反了基本的正常化和建立這樣的問題的地方你必須訴諸使用動態SQL。如果你每月有一行正常的表格,你可以寫一個簡單的靜態SQL語句。

你可以做這樣的事情

CREATE PROCEDURE update_value(p_value IN varchar2) 
AS 
    l_month_num integer := to_number(to_char(sysdate, 'mm')) ; 
BEGIN 
    IF(l_month_num = 1) 
    THEN 
    UPDATE report 
     SET jan = p_value; 
    ELSIF(l_month_num = 2) 
    THEN 
    UPDATE report 
     SET feb = p_alue; 
    ELSIF 
    ... 
    END IF; 
END; 
+0

Thx,Justin。如果我理解正確,你的每個月都會創建一個CASE語句,從而產生12個不同的查詢。 我知道這是一個糟糕的設計,但這是一個adhoc項目,每個邏輯都在數據庫中完成。編程語言只需顯示輸出,而不需要做太多的工作。 – 2012-03-30 04:41:19

+0

@ZaimanNoris - 是的,我的建議是創建一個'CASE'語句(或一系列'IF'語句 - 無論哪個更適合您),以便生成12個不同的查詢。你最好重構表格並編寫一個支持數據的視圖,但如果你不想改變模式,12個查詢可能是最簡單的方法。 – 2012-03-30 04:45:08

1

你使用什麼樣的數據庫?您可以通過使用過程輕鬆完成此操作(如果數據庫支持它們)。基於http://mkyong.com/oracle/oracle-stored-procedures-hello-world-examples

CREATE OR REPLACE PROCEDURE updateMonth(month IN NUMBER) 
IS 
BEGIN 
    CASE WHEN month = 1 THEN 
       Update report SET jan VALUE = "blalala" 
      WHEN month = 2 THEN 
       Update report SET feb VALUE = "blalala" ... 
    END CASE; 
END; 
+0

忘記提。它運行在Oracle 10g上。 – 2012-03-30 04:43:12

+0

我覺得你的工作很容易編寫一個程序來獲取輸入參數作爲月份編號。然後在內部程序中,您可以根據月份編號動態地編寫您的sql查詢。因此,您只需使用參數 – las 2012-03-30 05:10:22

+0

調用存儲過程。示例: - 創建或替換過程updateMonth(月份IN NUMBER)IS BEGIN CASE WHEN月= 1那麼更新報告SET jan VALUE =「blalala」WHEN month = 2那麼更新報告SET feb VALUE =「blalala」... END CASE;結束;/http://www.mkyong.com/oracle/oracle-stored-procedures-hello-world-examples/ – las 2012-03-30 05:22:54

0

(來自評論更新)

實施例首先,定義一個函數的SetValue(COLUMNNAME,columnValue);

SetValue(columnMonth,columnValue, newValue) 
{ 
    // firstly, get the month number from systemData 
    var curMonth = xxx;  
    // secondary, compare columnMonth and the month number from systemData 
    if (columnMonth == curMonth){ 
     return newValue; 
    } 
    else{ 
     return columnValue; 
    } 
} 

,然後下面寫SQL:

Update report SET jan VALUE = SetValue(1, jan, "blalala"), feb VALUE=SetValue(2,feb,"blalala") ....; 
+0

這裏的變量是列名(curMonth)而不是它自己的值。 它應該只更新一列(當前月份) – 2012-03-30 04:44:22