0
votes

Extraire peu de lettres de la colonne (les valeurs sont en chaîne)

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> xxx pré>

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      


1 commentaires

N'hésitez pas à partager ce que vous avez essayé avec substr et instr .


4 Réponses :


0
votes

Cela ressemble plus à la logique conditionnelle:

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


2 commentaires

Slip rare de Gordon :) Cela ne fonctionnera pas car _ est également un comme wildcard (correspond à un seul caractère). Échappez au soulignement en utilisant ... lorsque la classe comme «% \ _% \ _% 'ESCAPE' \ 'ALORN ... . De plus, le premier substraire doit être substr (classe, -7) . Fiddle .


@Edgibbs. . . Merci.



2
votes

semble être que vous n'avez que _all_set code> et _set code> suffixes, alors prenez 7 ou 3 caractères: xxx avant

Voir le Demo .
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


0 commentaires

1
votes

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


0 commentaires

2
votes

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 


0 commentaires