Обновить столбец на основе sysdate - PullRequest
0 голосов
/ 30 марта 2012

Моя текущая структура таблицы состоит из 12 столбцов, каждый из которых представляет месяц.

Мне нужно динамически выбрать столбец для обновления на основе sysdate.

для обновления, выполненного в январе, запрос должен выглядеть следующим образом: -

UPDATE report SET jan VALUE = 'blabla'

и для обновления, выполненного в декабре, запрос должен выглядеть следующим образом: -

UPDATE report SET dec VALUE = 'blabla'

Есть ли способ упростить это? Может быть, что-то вроде этого: -

UPDATE report SET curMonth() VALUE = 'blabla'

Ответы [ 3 ]

1 голос
/ 30 марта 2012

Таблица, которая имеет 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;
1 голос
/ 30 марта 2012

Какую базу данных вы используете?Вы можете легко сделать это, используя процедуры (если ваша база данных их поддерживает).

(обновление по комментариям)

Пример на основе 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 голосов
/ 30 марта 2012

Сначала определите функцию 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") ....;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...