2012-03-30 82 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