得到一个包含FLAG
列(任何字符)以及另外两个字段ESD
和TD
(两个日期)的表。
如果FLAG
对于该行不为null,则E
列必须以char ESD
开头,如果T
不为空,则必须在TD
之后该行为空。
注意
FLAG
永不为空ESD
可以为空TD
可以同时为空。ESD
和TD
都可以设置在同一行上。
在这种情况下,标记必须是ExT,其中x是
当前标志值。示例
之前
+-------+-------------+-------------+
| 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 |
+-------+-------------+-------------+
之后
+-------+-------------+-------------+
| 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中获得此结果的最简单方法是什么?
答案 0 :(得分:3)
您可以使用串联和两个大小写表达式:
case when esd is not null then 'E' end
|| flag
|| case when td is not null then 'T' end as flag
将您的数据包含在CTE中进行演示(更正为6月没有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;
,但是一旦填充了一个空日期列,该标志将是错误的,并且在需要时将更难重新计算。您可以在查询时调整它,也可以选择通过视图进行调整。或添加单独保存生成值的虚拟列。
答案 1 :(得分:2)
似乎使用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;