从列中提取几个字母(值在字符串中)

时间:2019-08-21 20:16:53

标签: sql oracle

需要提取“ CLASS”列的最后三个字母和取决于行的最后6个字母。在SQL Developer中。

我有下表-

ROW_NO    CLASS
   1      BLUE_ALL
   2      GREEN_ALL_SET             
   3      WHITE_ALL
   4      RED_ALL_SET
   5      YELLOW_ALL
   6      PURPLE_ALL_SET

我需要创建名为CATEGORY的第三列,如下所示

ROW_NO    CLASS            CATEGORY
   1      BLUE_ALL         ALL
   2      GREEN_ALL_SET    ALL_SET             
   3      WHITE_ALL        ALL
   4      RED_ALL_SET      ALL_SET
   5      YELLOW_ALL       ALL
   6      PURPLE_ALL_SET   ALL_SET      

谢谢

我尝试结合使用SUBSTR和INSTR函数

4 个答案:

答案 0 :(得分:2)

似乎您只有_ALL_SET_SET后缀,因此请使用最后7个或3个字符:

select row_no, class,
  substr(class, case when class like '%\_ALL\_SET' escape '\' then -7 else -3 end) category
from tablename

请参见demo
结果:

ROW_NO  CLASS               CATEGORY
1       BLUE_ALL            ALL
2       GREEN_ALL_SET       ALL_SET
3       WHITE_ALL           ALL
4       RED_ALL_SET         ALL_SET
5       YELLOW_ALL          ALL
6       PURPLE_ALL_SET      ALL_SET

答案 1 :(得分:2)

至少根据您提供的示例数据,似乎每种情况下您都希望在第一个下划线之后提取所有内容。

如果是这样:

select row_no, class, substr(class, instr(class, '_') + 1) as category
from   your_table
order  by row_no  --  if needed
;

演示

with
  your_table (row_no, class) as (
    select 1, 'BLUE_ALL'       from dual union all
    select 2, 'GREEN_ALL_SET'  from dual union all             
    select 3, 'WHITE_ALL'      from dual union all
    select 4, 'RED_ALL_SET'    from dual union all
    select 5, 'YELLOW_ALL'     from dual union all
    select 6, 'PURPLE_ALL_SET' from dual
  )
select row_no, class, substr(class, instr(class, '_') + 1) as category
from   your_table
order  by row_no  --  if needed
;

    ROW_NO CLASS          CATEGORY      
---------- -------------- --------------
         1 BLUE_ALL       ALL           
         2 GREEN_ALL_SET  ALL_SET       
         3 WHITE_ALL      ALL           
         4 RED_ALL_SET    ALL_SET       
         5 YELLOW_ALL     ALL           
         6 PURPLE_ALL_SET ALL_SET 

答案 2 :(得分:1)

一个选择是连续应用regexp_substr()分析函数和listagg()串联:

with t2 as
(
 Select Regexp_Substr(class, '[^_]+',1,level+1) as str, row_no, class, level as lvl
   From t
Connect By level <= Regexp_Count(class, '_')
and prior row_no = row_no and prior sys_guid() is not null
)
Select row_no, class, listagg(str, '_') within group ( order by lvl ) as category
  From t2
 Group By row_no, class;

ROW_NO  CLASS           CATEGORY
------  -------------   --------
1       BLUE_ALL        ALL
2       GREEN_ALL_SET   ALL_SET
3       WHITE_ALL       ALL
4       RED_ALL_SET     ALL_SET
5       YELLOW_ALL      ALL
6       PURPLE_ALL_SET  ALL_SET

Demo

答案 3 :(得分:0)

这看起来更像是条件逻辑:

select (case when class like '%\_%\_%' then substr(class, -6)
             else substr(class, -3)
        end)
相关问题