J'ai une exigence où il y a une colonne EVENTNAME qui peut contenir des textes comme BIRTHDAY mais aussi pour un événement OFFER spécial elle ne contiendra que des chiffres. Et j'ai besoin de trier deux types d'offres différents dont l'un est inférieur à 200 000 et le reste supérieur à 200 000.
Quelqu'un peut-il aider avec REGEXP_LIKE?
3 Réponses :
Utilisez regexp_substr () , convertissez en décimal et faites la comparaison:
where to_number(regexp_substr(eventname, '[0-9]+')) >= 200000
Utilisez regexp_like pour trouver de telles entrées et to_number pour convertir ces entrées en nombre à des fins de comparaison:
SELECT str, CASE
WHEN REGEXP_LIKE(str, '^\d{1,6}$') THEN CASE
WHEN TO_NUMBER(str) >= 200000 THEN 'more than 200000'
ELSE 'less than 200000'
END
ELSE str
END AS x_type
FROM (
SELECT 'Birthday' AS str FROM DUAL UNION
SELECT '200001' FROM DUAL
UNION SELECT '200000' FROM DUAL
) tests
\ D correspond à des caractères non chiffrés, vous pouvez donc faire ceci:
ID EVENTNAME TYPE
------ --------- ---------------
1 BIRTHDAY OTHER
2 4040404 OFFER OVER 200
3 404 OFFER BELOW 200
4 404 PQR OTHER
5 NAMEDAY OTHER
Résultat:
with t(id, eventname) as (
select 1, 'BIRTHDAY' from dual union all
select 2, '4040404' from dual union all
select 3, '404' from dual union all
select 4, '404 PQR' from dual union all
select 5, 'NAMEDAY' from dual )
select t.*,
case
when regexp_like(eventname, '\D') then 'OTHER'
when to_number(eventname) > 200000 then 'OFFER OVER 200'
else 'OFFER BELOW 200'
end type
from t
p >
Donnez-nous un échantillon des valeurs que vous avez dans cette colonne.
Il y a des chaînes comme
BIRTHDAY,ANNIVERSARY,NEW_GIFTalors qu'il n'y a que des nombres de 6 caractères comme100060ou200001. Je dois obtenir ces lignes avec uniquement des nombres et des valeurs supérieures à200000Donc chiffres seulement et aucun autre caractère?
Pouvez-vous s'il vous plaît modifier la question au lieu d'écrire des informations importantes ici en tant que commentaire.
Voter pour fermer car ce que vous demandez n'est pas clair.