J'ai besoin de créer une fonction de base de données Oracle qui prend une chaîne en tant que paramètre. La chaîne contient des lettres et des chiffres. J'ai besoin d'extraire tous les nombres de cette chaîne. Par exemple, si j'ai une chaîne telle que RO1234 , il faut que je puisse utiliser une fonction, disons extract_number('RO1234')
, et le résultat serait 1234 .
Pour être encore plus précis, il s'agit du type de requête SQL dans lequel cette fonction serait utilisée.
SELECT DISTINCT column_name, extract_number(column_name)
FROM table_name
WHERE extract_number(column_name) = 1234;
QUESTION: Comment puis-je ajouter une fonction de ce type à ma base de données Oracle afin de pouvoir l'utiliser comme dans l'exemple ci-dessus, en utilisant l'une des applications clientes Oracle SQL Developer ou SQLTools?
Vous utiliseriez REGEXP_REPLACE
pour supprimer tous les caractères non numériques d'une chaîne:
select regexp_replace(column_name, '[^0-9]', '')
from mytable;
ou
select regexp_replace(column_name, '[^[:digit:]]', '')
from mytable;
Bien sûr, vous pouvez écrire une fonction extract_number
. Cela semble un peu exagéré cependant, d’écrire une fonction qui consiste en un seul appel de fonction.
create function extract_number(in_number varchar2) return varchar2 is
begin
return regexp_replace(in_number, '[^[:digit:]]', '');
end;
Vous pouvez utiliser expressions régulières pour extraire le nombre d'une chaîne. Permet de vérifier. Supposons que ceci soit la chaîne mélangeant le texte et les nombres 'stack12345overflow569'. Celui-ci devrait fonctionner:
select regexp_replace('stack12345overflow569', '[[:alpha:]]|_') as numbers from dual;
qui retournera "12345569".
aussi vous pouvez utiliser celui-ci:
select regexp_replace('stack12345overflow569', '[^0-9]', '') as numbers,
regexp_replace('Stack12345OverFlow569', '[^a-z and ^A-Z]', '') as characters
from dual
qui retournera "12345569" pour les nombres et "StackOverFlow" pour les caractères.
Si vous recherchez un 1er nombre avec une décimale sous forme de chaîne avec des décimales correctes, vous pouvez essayer regexp_substr
fonction comme ceci:
regexp_substr('stack12.345overflow', '\.*[[:digit:]]+\.*[[:digit:]]*')