Обновить колонку в oracle векторизованным способом - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть следующая таблица:

Year Month Day TIME_ID

2018  12  29  (null)

2017  12  21  (null)

...   ...  ...  ...

Я хочу заполнить столбец TIME_ID следующим образом: select Year||Month||Day from Table.

Но я попробовал следующий оператор обновления update TABLE set TIME_ID = (выберите Year || Month || Day from Table), но он не работает, потому что, как я понял, эта операция не векторизована.

Вопрос: как эффективно заполнить столбец TIME_ID?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

как эффективно заполнить столбец TIME_ID?

Использовать тип данных DATE:

UPDATE table_name
SET time_id = TO_DATE(
                TO_CHAR( year, '0000' )
                  || TO_CHAR( month, '00' )
                  || TO_CHAR( day, '00' ),
                'YYYYMMDD'
              );

Если вы действительно хотите, чтобы он был эффективнымзатем просто сохраните столбец time_id как тип данных DATE и выведите столбцы year, month и day из него как виртуальные столбцы, а не наоборот:

CREATE TABLE table_name (
  time_id DATE,
  year    NUMBER(4,0) GENERATED ALWAYS AS ( EXTRACT( YEAR  FROM time_id ) ),
  month   NUMBER(2,0) GENERATED ALWAYS AS ( EXTRACT( MONTH FROM time_id ) ),
  day     NUMBER(2,0) GENERATED ALWAYS AS ( EXTRACT( DAY   FROM time_id ) )
);

Таким образом, вы не можете вставить недопустимую дату, такую ​​как 2018-02-31, а столбцы YEAR, MONTH и DAY всегда будут точно отражать значение в столбце TIME_ID.

Вставка образцаданные:

INSERT INTO table_name ( time_id )
  SELECT DATE '2018-12-29' FROM DUAL UNION ALL
  SELECT DATE '2017-12-21' FROM DUAL;

Тогда вы можете использовать:

SELECT * FROM table_name;
TIME_ID    | YEAR | MONTH | DAY
:--------- | ---: | ----: | --:
2018-12-29 | 2018 |    12 |  29
2017-12-21 | 2017 |    12 |  21

дБ <> скрипка здесь


Если вы должны использовать числа для year, month и day, то для столбца time_id, а затем снова использовать виртуальный столбец:

CREATE TABLE table_name2 (
  year    NUMBER(4,0),
  month   NUMBER(2,0),
  day     NUMBER(2,0),
  time__id DATE GENERATED ALWAYS AS (
    TO_DATE(
      TO_CHAR( year, '0000' )
        || TO_CHAR( month, '00' )
        || TO_CHAR( day, '00' ),
      'YYYYMMDD'
    )
  )
);

дБ <> скрипка здесь

0 голосов
/ 25 февраля 2019

Просто используйте это, если ваш time_id тип VARCHAR2 или NUMBER

UPDATE table_name
SET time_id = year || month || day;

Если ваш time_id столбец имеет тип DATE, тогда используйте TO_DATEвместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...