Вы можете использовать конкатенацию и два регистра символов:
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;
но тогда флаг будет неправильным, как только заполнится нулевой столбец даты, и будет сложнее пересчитать, когда вам нужно. Вы должны либо просто настроить это, когда вы запрашиваете это, необязательно через представление; или добавьте виртуальный столбец, который содержит сгенерированное значение отдельно.