“Coffre-fort” TO_NUMBER()
SELECT TO_NUMBER('*') FROM DUAL
De toute évidence, cela me donne une exception:
ORA-01722: nombre non valable
Est-il un moyen de "sauter" et obtenir 0
ou NULL
à la place?
L'ensemble de la question: j'ai NVARCHAR2
domaine, qui contient des nombres et presque pas 😉 (comme *
) et j'ai besoin de sélectionner le plus grand nombre de la colonne.
Oui, je sais, c'est un terrible du design, mais c'est ce dont j'ai besoin maintenant... :-S
UPD:
Pour moi, je l'ai résolu ce problème avec
COALESCE(TO_NUMBER(REGEXP_SUBSTR(field, '^\d+')), 0)
- Est * le seul personnage que vous vous attendez à rencontrer?
- Poneys: nan... j'ai résolu ce problème avec laide
REGEXP_SUBSTR(field, '^\d+')
Vous devez vous connecter pour publier un commentaire.
Je ne pouvais pas trouver quelque chose de mieux que cela:
54-3
devrait devenir54
, je n'ai pas mentionné que, désolé).permettra également d'obtenir des numéros à l'échelle > 0 (chiffres à droite du point décimal).
^\-?\d*\.?\d*$
qui permet de nombres négatifs et les numéros commençant par.
, et n'autorise pas non numériques caractères de fin. Le^\d+(\.\d+)?
regex rendements1
sifield
contient1x
, et0' if
champ " contient0.0.1
, et0
sifield
contient0 6
, etc.De
Oracle Database 12c Release 2
vous pouvez utiliser TO_NUMBER avecDEFAULT ... ON CONVERSION ERROR
:Ou
CAST
:db<>le violon de démonstration
Il vous permet de convertir 123 à 123, mais 123a ou 12a3 à 0.
Côté la question originale et plutôt old skool
543
de la chaîne54-3
. Je n'en fait pas mention dans la question, mais dans ce cas j'attends54
(et c'est ce que ma solution avec regexp n').C'est probablement un peu brouillon rouler votre propre regexp pour tester un certain nombre, mais le code ci-dessous pourrait fonctionner. Je pense que l'autre solution par Gabe impliquant une fonction définie par l'utilisateur est plus robuste puisque vous êtes en utilisant l'Oracle de la fonctionnalité (et ma regexp n'est probablement pas correct à 100%), mais il pourrait être la peine d'aller:
Cela donnera alors la sortie suivante:
Présent code, à l'exclusion des chaînes comme: -1-1, 1..1, 12-2 et ainsi de suite. Et je n'ai pas utilisé les expressions régulières ici.
Une combinaison de solutions précédentes (à partir de @sOliver et @Mike Meyers) et en essayant d'attraper autant de numéros que possible par la suppression de la dernière '$' à partir de REGEXP.
Il peut être utilisé pour filtrer le nombre réel à partir d'une table de configuration, et ont une "sorte-de" commentaire suivant le nombre que "12 Jours".
with my_sample_data as (
select '12345' as mynum from dual union all
select '123.4567' as mynum from dual union all
select '-0.3462' as mynum from dual union all
select '.34567' as mynum from dual union all
select '-.1234' as mynum from dual union all
select '**' as mynum from dual union all
select '0.34.62' as mynum from dual union all
select '24Days' as mynum from dual union all
select '42ab' as mynum from dual union all
select '54-3' as mynum from dual
)
SELECT mynum,
COALESCE( TO_NUMBER( REGEXP_SUBSTR( mynum, '^(-|+)?\d*(.|,)?(\d+)?') ) , 0) is_num
FROM my_sample_data;
donnerait
Meilleure méthode semble être la fonction la solution, mais si vous n'avez pas les privilèges nécessaires dans l'environnement, vous êtes en difficulté (comme moi), alors vous pouvez essayer celui-ci:
Par la route: Dans mon cas, le problème était dû à des "," et "." 🙂 Pour prendre cela en considération. Inspiré de cette une. Aussi cette une semble plus concis.
Par la voie 2: Cher Oracle, pouvez-vous s'il vous plaît créer quelques fonctions intégrées pour de petits mais précieux besoins?