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
3 Réponses :
Une option serait
select replace(regexp_substr(str,'[^:]+$'), regexp_substr(str,'[^:][^ ]+$'),'') as course_id from tab
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 .
J'utiliserais regexp_replace (str, '(. *:) (. *) () (. *) $', '\ 2') comme short_course_id
yors is better @ThomasStrub convertir en réponse.
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
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.