0
votes

Comment retourner une sous-chaîne après un côlon et avant un espace blanche dans Oracle SQL

J'ai besoin d'obtenir une sous-chaîne d'une colonne de table qui se trouve après un deux-points et avant un espace blanc. La longueur de la sous-chaîne peut varier, mais la longueur des données avant les deux points et après l'espace blanc est constante.

Les données de ma colonne de table nommée "Sujet" se composent donc de 5 mots, immédiatement suivis de deux points, immédiatement suivis de la sous-chaîne dont j'ai besoin (dont la longueur peut varier), suivis d'un espace et d'une date. La sous-chaîne dont j'ai besoin est un nom de cours. Exemples:

Paiement dû pour le cours à venir: FIN / 370T 26/11/2019

Paiement dû pour le cours à venir: BUS / 475 26/11/2019

Paiement dû pour le cours à venir: ADMIN9 / 475TG 26/11/2019

J'ai essayé d'utiliser la fonction REGEXP avec REGEXP_SUBSTR (COLUMN_NAME, '[^:] + $') pour tout obtenir après les deux points, et REGEXP_SUBSTR (COLUMN_NAME, '[^] +', 1, 5) pour obtenir des données avant le dernier espace, mais je dois les combiner.

J'ai essayé ce qui suit:

  select 
       REGEXP_SUBSTR (SUBJECT, '[^ ]+' , 1 , 5 ) COURSE_ID2          

  from TABLE

  Result: 
  Course:FIN/370T

et ceci:

  select 
       REGEXP_SUBSTR(SUBJECT,'[^:]+$')  COURSE_ID

  from TABLE


  Result:
  FIN/370T 11/26/2019

J'ai besoin de la sortie pour retourner FIN / 370T


0 commentaires

3 Réponses :


0
votes

Une option serait

select replace(regexp_substr(str,'[^:]+$'),
               regexp_substr(str,'[^:][^ ]+$'),'') as course_id
  from tab

Démo

où le premier regexp_substr () extrait la sous-chaîne en commençant par les deux points à la fin, et la seconde du dernier espace à la fin .


2 commentaires

J'utiliserais regexp_replace (str, '(. *:) (. *) () (. *) $', '\ 2') comme short_course_id


yors is better @ThomasStrub convertir en réponse.



0
votes

Si vous ne voulez pas jouer avec regex, vous pouvez utiliser une combinaison de substr et d'instr.

select
substr(part1,1,instr(part1, ' ',-1,1) ) as course,
part1
from (
select
substr(<your column>,instr(<your column>,':',1,1) +1) as part1
from
<your table>
  ) t

Fiddle


0 commentaires

1
votes

En bref:

select regexp_replace(str,'(.*:)(.*)( )(.*)$','\2') as short_course_id
  from tab

Je préfère regexp_replace , car il y a plus de possibilités d'extraire une partie des chaînes.


0 commentaires