Bonjour,
Existe t'il dans Oracle l'équivalent SqlServer de la fonction IsNumeric ?
Bonjour,
Existe t'il dans Oracle l'équivalent SqlServer de la fonction IsNumeric ?
Bonjour et bienvenue sur le forum !
Suivant votre besoin précis, c'est sans doute le IS OF qui convient.
Pour la perfection de vos messages, songez à lire les règles du forum, et en particulier à mettre des titres aussi précis que possible.
Par exemple "Equivalent Oracle du IsNumeric SQL Server"
je dois tester dans une fonction CASE si un champ et numérique ou non. Selon le cas, je ne traite pas l'information de la même facon.
C'est du SQL dynamique ?Envoyé par PJ_56
Sinon le type du champ peut être obtenu par la colonne DATATYPE de USER_TAB_COLUMNS.
C'est un simple select. C'est un champ Varchar auquel je veux extraire toutes les valeurs qui sont numériques dans un champ numérique qui est dans une autre table. Je fais ca avec un ETL. En Sql Server ca donne quelque chose du style
CASE isnumeric(<Mon Champ>) THEN <Mon Champ> ELSE 0 END;
On peut aussi jouer avec les exceptions de la fonction TO_NUMBER en PL/SQL
Sinon, voila une méthode :
Explication :
Code : Sélectionner tout - Visualiser dans une fenêtre à part DECODE(LENGTH(REPLACE(TRANSLATE(REPLACE(col,' ','@'),'1234567890.,',' '),' ','')),0,col,0)
Je commence par remplacer les espaces de la colonne par des @, ensuite j'efface tous les caractères numériques comprenant les chiffres et les séparateur . et ,
Enfin je fais un décode de la longueur du résultat. Si elle est égale à 0 c'est que je n'ai supprimé que des caractères numériques et donc que la colonne est numérique.
Limitation : Si la colonne contient plusieurs . ou , la solution doit être adaptée![]()
Je pense que le plus simple est de laisser Oracle essayer de convertir ta chaine en nombre pour voir si c'est une chaine numérique ou pas.
Une chaine peut être convertit en numérique de plusieurs facons : 1, 1.3, 1E3, 1E-10...
J'utiliserais la fonction suivante qui renvoie 1 si c'est numérique ou 0 sinon :
Je viens de voir que c'est exactement ce que dis Orafrance juste au dessus
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 create or replace function isNumeric(x in varchar2) return number as nb number; begin nb := to_number(x); return 1; exception when others then return 0; end;
Laly.
In the heart of the truly greats, perfection is never achieved but endlessly pursued.
Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)
mais j'avais pas donné les détails
PS : Laly, tu peux l'intégrer dans la FAQ non ?![]()
Merci ca fonctionne nickel !!!
désolé de réveiller ce vieux sujet, mais nous avons eu ce besoin aujourd'hui sans pouvoir faire de fonction stockée. Nous sommes donc passés par une expression régulière que voici :
Exemples de nombres :
Code : Sélectionner tout - Visualiser dans une fenêtre à part REGEXP_LIKE(CHAINE_A_TESTER,'^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i')
Exemples de pas nombres :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 SELECT '1', CASE WHEN REGEXP_LIKE('1','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i')THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL UNION SELECT '+2', CASE WHEN REGEXP_LIKE('+2','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL UNION SELECT '3,4', CASE WHEN REGEXP_LIKE('3,4','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL UNION SELECT '-5', CASE WHEN REGEXP_LIKE('-5','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL UNION SELECT '6E78', CASE WHEN REGEXP_LIKE('6E78','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL UNION SELECT '9E-5', CASE WHEN REGEXP_LIKE('9E-5','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL UNION SELECT '3,E6', CASE WHEN REGEXP_LIKE('3,E6','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL UNION SELECT '-,45E7', CASE WHEN REGEXP_LIKE('-,45E7','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL UNION SELECT '4,', CASE WHEN REGEXP_LIKE('4,','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL
Bloon
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 SELECT '1,1,1', CASE WHEN REGEXP_LIKE('1,1,1','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL UNION SELECT '1A', CASE WHEN REGEXP_LIKE('1A','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL UNION SELECT '1E', CASE WHEN REGEXP_LIKE('1E','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL UNION SELECT '1E1,2', CASE WHEN REGEXP_LIKE('1E1,2','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL UNION SELECT '-5-5', CASE WHEN REGEXP_LIKE('-5-5','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL UNION SELECT '1 2', CASE WHEN REGEXP_LIKE('1 2','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL UNION SELECT '-,E7', CASE WHEN REGEXP_LIKE('-,E7','^(-|\+)?(\d*|\d+,|,\d+|\d+,\d+)(E(-|\+)?\d+)?$','i') THEN 'est un nombre' ELSE 'n''est pas un nombre' END FROM DUAL
Partager