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 :

Comparaison de champs avec TO_NUMBER


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut Comparaison de champs avec TO_NUMBER
    Bonjour à tous,

    j'ai une table avec 2 champs de type VARCHAR2, mais qui contiennent des valeurs numérique. Le séparateur décimal n'étant pas celui sur ma base de donnée (que je ne souhaite pas modifier), je réalise au préalable un REPLACE.

    Cette requête fonctionne:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select TO_NUMBER(replace(RESULTAT, '.', ',')) , To_NUMBER(replace(LIMITE, '.', ','))
    from MA_TABLE
    WHERE RESULTAT is not null
    and LIMITE is not null
    Maintenant je souhaite afficher uniquement les résultats supérieurs à la limite en faisant:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select TO_NUMBER(replace(RESULTAT, '.', ',')) , TO_NUMBER(replace(LIMITE, '.', ','))
    from MA_TABLE
    WHERE RESULTAT is not null
    and LIMITE is not null
    and TO_NUMBER(replace(RESULTAT, '.', ',')) >= TO_NUMBER(replace(LIMITE, '.', ','))
    J'obtiens une erreur invalid number

    Comment effectuer cette comparaison?
    Merci d'avance

  2. #2
    Membre expérimenté Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Par défaut
    si ces champs contiennent des valeurs numériques, pourquoi pas les déclarer comme NUMBER dés le début.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Je pense que votre première requête fonctionne sur le premier fetch de données mais pas sur l'ensemble de votre table.

    Votre format spécifié n'est donc pas toujours vérifié et/ou pas suffisant et/ou il y a autre chose que du numérique dans vos colonnes.

    Si la requête suivante donne des résultats, ce n'est pas bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select resultat, limite
      from ma_table
     where resultat is not null
       and limite   is not null
       and (translate(resultat, '0123456789.', '') is not null
         or translate(limite  , '0123456789.', '') is not null);

  4. #4
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Merci pour vos réponses.

    si ces champs contiennent des valeurs numériques, pourquoi pas les déclarer comme NUMBER dés le début.
    Je travaille sur une table existante que je ne peux pas modifier

    Je pense que votre première requête fonctionne sur le premier fetch de données mais pas sur l'ensemble de votre tablen
    J'ai fais le test, et ma première requête fonctionne et me retourne bien tous les résultats.
    Si la requête suivante donne des résultats, ce n'est pas bon
    La requête fournie ne me retourne aucun résultats.

    Quelqu'un aurait-il une autre idée de la provenance du problème?

  5. #5
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Bon, à défaut de comprendre la raison du problème, j'ai trouver une autre solution qui fonctionne en modifiant la requête:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT nb1, nb2
    FROM
    (
      SELECT TO_NUMBER(REPLACE(RESULTAT, '.', ',')) as nb1 , TO_NUMBER(REPLACE(LIMITE, '.', ',')) as nb2
      FROM MA_TABLE
      WHERE RESULTAT IS NOT NULL
      AND LIMITE IS NOT NULL
    )
    WHERE nb1 >= nb2

  6. #6
    Membre expérimenté
    Inscrit en
    Mars 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 205
    Par défaut
    Je comprends d'autant moins qu'après quelques tests, les deux requêtes que tu donnes ne fonctionnent pas, ce qui est d'ailleurs plus cohérent que le comportement sur ta base

    J'ai réussi à faire fonctionner ta requête en changeant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    alter session set nls_language='AMERICAN'
    alter session set nls_territory='AMERICA'
    Le problème vient apparemment de l'interprétation des données en fonction du langage sélectionné.

    Ah, j'oubliais, ça fonctionne également en paramétrage français, il suffit d'enlever les replace de la requête, mais je n'ai pas vérifié si ça donne des résultats cohérents...

  7. #7
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Ah, j'oubliais, ça fonctionne également en paramétrage français, il suffit d'enlever les replace de la requête, mais je n'ai pas vérifié si ça donne des résultats cohérents
    Le séparateur décimal de la base Oracle est définie dans NLS_NUMERIC_CHARACTERS.

    Dans mon cas c'est la virgule ',' ce qui explique que je passe par un REPLACE.

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

Discussions similaires

  1. Comparaison de champs date avec NOW
    Par xxkirastarothxx dans le forum MySQL
    Réponses: 5
    Dernier message: 11/02/2010, 15h17
  2. Comparaison de 2 champs avec des antislash
    Par loic72 dans le forum Access
    Réponses: 9
    Dernier message: 15/06/2006, 12h13
  3. ASP champs avec même nom
    Par pete007 dans le forum ASP
    Réponses: 8
    Dernier message: 03/05/2004, 22h58
  4. [CR][ASP.NET] Un champ avec plusieurs polices...
    Par David.V dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 08/04/2004, 14h19
  5. Comment renommer un champ avec Module BD?
    Par technico dans le forum Bases de données
    Réponses: 4
    Dernier message: 27/01/2004, 21h24

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