besoin d'extraire les trois dernières lettres de la colonne «classe» et de 6 dernières lettres en fonction des lignes. Dans le développeur SQL.
J'ai le tableau suivant - p> J'ai besoin de créer une troisième colonne appelée catégorie comme indique ci-dessous P> 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
4 Réponses :
Cela ressemble plus à la logique conditionnelle:
select (case when class like '%\_%\_%' then substr(class, -6)
else substr(class, -3)
end)
Slip rare de Gordon :) Cela ne fonctionnera pas car _ code> est également un comme code> wildcard (correspond à un seul caractère). Échappez au soulignement en utilisant ... lorsque la classe comme «% \ _% \ _% 'ESCAPE' \ 'ALORN ... CODE>. De plus, le premier code> substraire code> doit être substr (classe, -7) code>. Fiddle .
@Edgibbs. . . Merci.
semble être que vous n'avez que Voir le Demo . _all_set code> et _set code> suffixes, alors prenez 7 ou 3 caractères:
Résultats: P> 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
une option appliquerait regexp_substr () code> fonction analytique et listagg () code> Concaténation consécutivement: 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
Au moins sur la base des données d'échantillon que vous avez fournies, il semble que dans tous les cas, vous souhaitez tout extraire après le premier soulignement.
Si oui: P>
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
N'hésitez pas à partager ce que vous avez essayé avec
substr code> etinstr code>.