IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Equivalent de la fonction SqlServer IsNumeric()


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Equivalent de la fonction SqlServer IsNumeric()
    Bonjour,

    Existe t'il dans Oracle l'équivalent SqlServer de la fonction IsNumeric ?

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    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"
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    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.

  4. #4
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par PJ_56
    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 ?
    Sinon le type du champ peut être obtenu par la colonne DATATYPE de USER_TAB_COLUMNS.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    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;

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    On peut aussi jouer avec les exceptions de la fonction TO_NUMBER en PL/SQL

    Sinon, voila une méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECODE(LENGTH(REPLACE(TRANSLATE(REPLACE(col,' ','@'),'1234567890.,','            '),' ','')),0,col,0)
    Explication :

    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

  7. #7
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    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 :
    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;
    Je viens de voir que c'est exactement ce que dis Orafrance juste au dessus

    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...)

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    mais j'avais pas donné les détails

    PS : Laly, tu peux l'intégrer dans la FAQ non ?

  9. #9
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 12
    Points : 10
    Points
    10
    Par défaut MERCI
    Merci ca fonctionne nickel !!!

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    un p'tit tag résolu STP

  11. #11
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    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 :

    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 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
    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
    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
    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Equivalent d'une Fonction MS-SQLSERVER
    Par Samish dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 29/07/2009, 14h26
  2. [C#] Equivalence de la fonction VB isnumeric() en C#
    Par edzodzinam dans le forum ASP.NET
    Réponses: 15
    Dernier message: 22/02/2006, 15h09
  3. Réponses: 9
    Dernier message: 24/05/2005, 16h34
  4. Equivalent de la fonction d'agregat LIST ?
    Par rahan15 dans le forum SQL
    Réponses: 5
    Dernier message: 10/12/2004, 22h21
  5. Equivalent de la fonction trim
    Par PCHINK dans le forum C
    Réponses: 6
    Dernier message: 21/03/2004, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo