需要提取“ 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函数
答案 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
答案 3 :(得分:0)
这看起来更像是条件逻辑:
select (case when class like '%\_%\_%' then substr(class, -6)
else substr(class, -3)
end)