通过添加列以所需格式输出Oracle SQL查询

时间:2018-10-04 15:03:22

标签: sql oracle

我具有以下数据的oracle数据库表“ mytable”-

ID          ORDER    ACTION     CB        TV
35547225    CHANGE<  Add        TV       100788581
35355239    CHANGE<  Add        G76763164 014580531
35779535    CHANGE   Add        TVservi   038894810
35591230    CHANGE<  Add        G87178597   
35814001    CHANGE   Rem        TVservi   011733179
35418962    CHANGE<  Rem        TV        011733179

我想以以下格式获取输出,并在其他列中添加“ CT”-

ID          ORDER   ACTION  CB          TV          CT
35547225    CHANGE  Add                 100788581   Only TV
35355239    CHANGE  Add     G76763164   014580531   Both
35779535    CHANGE  Add                 038894810   Only TV
35591230    CHANGE  Add     G87178597               Only CB
35814001    CHANGE  Remove              011733179   Only TV
35418962    CHANGE  Remove              011733179   Only TV

我要跟踪输出的变化-

  • 在“ ORDER”列中-如果在“ mytable”中为“ CHANGE <”,则应为 输出为“ CHANGE”。

  • “操作”列中的
  • -如果“ mytable”中为“ Rem”,则应为 在输出中“删除”。

  • 在“ CB”列中-如果它以G开头,然后是8位数字,则 保持原样,否则在输出中将其设置为NULL

  • 通过基于以下内容编写注释,在输出中再添加一列“ CT” 符合条件-

    • 如果CB为NULL,电视不为NULL,则“仅电视”

    • 如果CB不为空,电视不为空,则“两者”

    • 如果CB不为空而TV为NULL,则“仅CB”

1 个答案:

答案 0 :(得分:3)

您可以使用CASE子句根据任意逻辑来计算各种列值:

select
    id,
    case when "order" = 'CHANGE' then 'CHANGE'
         when "order" = 'CHANGE<' then 'CHANGE'
    end as "order",
    case when action = 'Rem' then 'Remove'
         else action
    end as action,
    case when regexp_like(cb, 'G[0-9]{8}') then cb
         else null
    end as cb,
    tv,
    case when cb is null and tc is not null then 'Only TV'
         when cb is not null and tv is not null then 'Both'
         when cb is not null and tv is null then 'Only CB'
    end as ct
  from my_table

请注意,order是保留字,通常不用作列名。如果要使用它,则需要用双引号(“)括起来。