Обновление столбца в зависимости от значения, заданного в другом столбце в той же строке - PullRequest
0 голосов
/ 03 июля 2018

Получил таблицу, содержащую столбец FLAG (любой символ) и два других поля ESD и TD (обе даты). Столбцу FLAG должен предшествовать либо символ E, если ESD не является нулевым для этой строки, либо после T, если TD не является нулевым для этой строки.

Примечание

  1. FLAG никогда не обнуляется
  2. ESD может быть нулевым TD может быть нулевым одновременно или нет.
  3. ESD и TD могут быть установлены в одном ряду. В таком случае флаг должен быть ExT, где x - это текущее значение флага.

Пример * +1029 *

До

+-------+-------------+-------------+
| FLAG  | ESD         | TD          |
+-------+-------------+-------------+
|  V    | 2018/05/01  | (null)      |
|  D    | (null)      | (null)      |
|  V    | (null)      | (null)      |
|  V    | (null)      | 2018/06/31  |
|  V    | (null)      | (null)      |
|  D    | 2018/01/01  | 2018/08/31  |
+-------+-------------+-------------+

* После 1038 *

+-------+-------------+-------------+
| FLAG  | ESD         | TD          |
+-------+-------------+-------------+
|  EV   | 2018/05/01  | (null)      |
|  D    | (null)      | (null)      |
|  V    | (null)      | (null)      |
|  VT   | (null)      | 2018/06/31  |
|  V    | (null)      | (null)      |
|  EDT  | 2018/01/01  | 2018/08/31  |
+-------+-------------+-------------+

Вопрос

Какой самый простой способ получить этот результат в SQL или PL / SQL?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Похоже на простое обновление с использованием CASE операторов?

UPDATE [table] SET FLAG = CASE WHEN ESD IS NOT NULL THEN 'E' ELSE '' END || FLAG || CASE WHEN TD IS NOT NULL THEN 'T' ELSE '' END;
0 голосов
/ 03 июля 2018

Вы можете использовать конкатенацию и два регистра символов:

case when esd is not null then 'E' end
  || flag
  || case when td is not null then 'T' end as flag

Демонстрация с вашими данными в CTE (с поправкой на июнь без 31 дня):

with your_table (FLAG, ESD, TD) as (
            select 'V', date '2018-05-01', null from dual
  union all select 'D', null, null from dual
  union all select 'V', null, null from dual
  union all select 'V', null, date '2018-06-30' from dual
  union all select 'V', null, null from dual
  union all select 'D', date '2018-01-01', date '2018-08-31' from dual
)
select
  case when esd is not null then 'E' end
    || flag
    || case when td is not null then 'T' end as flag,
  esd,
  td
from your_table;

FLAG ESD        TD                          
---- ---------- ----------------------------
EV   2018-05-01                             
D                                           
V                                           
VT              2018-06-30                  
V                                           
EDT  2018-01-01 2018-08-31                  

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

update your_table
set flag = 
  case when esd is not null then 'E' end
    || flag
    || case when td is not null then 'T' end;

но тогда флаг будет неправильным, как только заполнится нулевой столбец даты, и будет сложнее пересчитать, когда вам нужно. Вы должны либо просто настроить это, когда вы запрашиваете это, необязательно через представление; или добавьте виртуальный столбец, который содержит сгенерированное значение отдельно.

...