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_GIFT
alors qu'il n'y a que des nombres de 6 caractères comme100060
ou200001
. Je dois obtenir ces lignes avec uniquement des nombres et des valeurs supérieures à200000
Donc 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.