根据同一行另一列中设置的值更新列

时间:2018-07-03 08:43:53

标签: sql oracle oracle11g sql-update

得到一个包含FLAG列(任何字符)以及另外两个字段ESDTD(两个日期)的表。 如果FLAG对于该行不为null,则E列必须以char ESD开头,如果T不为空,则必须在TD之后该行为空。

注意

  1. FLAG永不为空
  2. ESD可以为空TD可以同时为空。
  3. ESDTD都可以设置在同一行上。 在这种情况下,标记必须是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中获得此结果的最简单方法是什么?

2 个答案:

答案 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;