【问题标题】:Updating a column depending on the value set in another column in the same row根据同一行另一列中设置的值更新列
【发布时间】:2018-12-11 12:15:25
【问题描述】:

得到一个包含FLAG 列(任何字符)和另外两个字段ESDTD(两个日期)的表。 FLAG 列的前面必须是字符 E(如果该行的 ESD 不为空),或者如果该行的 TD 不为空,则后跟 T

注意

  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 中获得此结果的最简单方法是什么?

【问题讨论】:

  • 你真的要更新存储在表中的值吗?或者只是查询表时它在结果集中的显示方式?
  • 我正在尝试在表格中更新它

标签: sql oracle oracle11g sql-update


【解决方案1】:

您可以使用连接和两个 case 表达式:

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;

但是一旦填充了空日期列,该标志就会出错,并且在需要时更难重新计算。您应该在查询时调整它,可选地通过视图;或者添加一个单独保存生成值的虚拟列。

【讨论】:

    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 2023-02-22
      相关资源
      最近更新 更多