【问题标题】:Update column based on sysdate根据 sysdate 更新列
【发布时间】:2012-03-30 04:04:23
【问题描述】:

我当前的表结构是 12 列,每列代表月份。

我需要根据 sysdate 动态选择要更新的列。

对于 1 月完成的更新,查询应如下所示:-

UPDATE report SET jan VALUE = 'blabla'

对于 12 月完成的更新,查询应如下所示:-

UPDATE report SET dec VALUE = 'blabla'

有什么办法可以简化这一点。也许会变成这样:-

UPDATE report SET curMonth() VALUE = 'blabla'

【问题讨论】:

  • 这是什么风格的数据库?
  • 我必须列 - 值和日期。如果你想要一个 12 列的结果,按月份细分——使用 PIVOT 查询。

标签: sql oracle dynamic-sql


【解决方案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;

【讨论】:

  • 谢谢,贾斯汀。如果我理解正确,您的任务是为每个月创建一个 CASE 语句,从而产生 12 个不同的查询。我知道这是一个糟糕的设计,但这是一个临时项目,每个逻辑都在数据库中完成。编程语言只显示输出而无需做太多工作。
  • @ZaimanNoris - 是的,我的建议是创建一个CASE 语句(或一系列IF 语句——任何更适合你的语句),以便生成12 个不同的查询。您最好重构表并编写一个透视数据的视图,但如果您不想更改架构,12 个查询可能是最简单的方法。
【解决方案2】:

您使用的是什么类型的数据库?您可以使用过程轻松完成此操作(如果您的数据库支持它们)。

(来自 cmets 的更新)

示例基于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; 

【讨论】:

  • 忘了说。它在 Oracle 10g 上运行。
  • 我认为你的工作将很容易编写一个程序来获取输入参数作为月份数。然后在程序内部,您可以根据月份数动态编写您的 sql 查询。所以你只需要调用带有参数的存储过程
  • 示例 : - 创建或替换过程 updateMonth(month IN NUMBER) 是 BEGIN CASE WHEN month = 1 THEN Update report SET jan VALUE = "blalala" WHEN month = 2 THEN Update report SET feb VALUE = " blalala" ...结束案例;结尾; /mkyong.com/oracle/oracle-stored-procedures-hello-world-examples
  • 更新了响应以包含来自 cmets 的代码以提高可读性。
【解决方案3】:

首先定义一个函数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") ....;

【讨论】:

  • 这里的变量是列名(curMonth)而不是它自己的值。它应该只更新一列(当前月份)
猜你喜欢
  • 2012-01-11
  • 1970-01-01
  • 2017-04-16
  • 2015-08-10
  • 1970-01-01
  • 2021-12-09
  • 2020-07-28
  • 2021-03-30
  • 1970-01-01
相关资源
最近更新 更多