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

Langage SQL Discussion :

[DB2] Transtypage de character à numeric


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 213
    Points : 154
    Points
    154
    Par défaut [DB2] Transtypage de character à numeric
    Bonjour,

    J'ai déjà poster ce sujet dans le forum DB2 mais je pense que ce forum est le plus approprié.

    J'ai une table de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Numéro article (character(15))  Epaisseur (character(25))
    1111111111111                               AD
    2314444445645                               12,400
    2818447544152                               5,200
    .......
    Ce que je veux faire c'est :
    -selectionner tous les codes articles qui ont une eppaisseur supérieur à 12 (par exemple)

    Pour ce faire j'ai essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select code_article from matable where  num(epaisseur)>12
    Le problème c'est que lorsque le champs epaisseur vaut 'AD' le moteur SQL plante.
    J'ai voulu faire un case mais à ma connaissance on ne peut peut faire un case que dans le select et pas dans le where mais peut être que si?!!
    Donc si quelqu'un pouvait m'aider ce serait sympa
    merci d'avance

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    En SQL, pas possible d'appliquer une fonction de transtypage si des données ne peuvent pas être converties.

    Une solution "bidouille" serait de ramener les données pour lesquelles le champ Epaisseur a une valeur numérique, puis de faire une requête sur ce jeu de résultat avec la clause de comparaison.

    Voici un exemple avec Oracle :

    1) Jeu d'essais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE TEST (
    NUMERO NUMBER (10),
    EPAISSEUR VARCHAR2 (25));
     
    INSERT INTO TEST VALUES (1, 'AD');
    INSERT INTO TEST VALUES (2, '12,400');
    INSERT INTO TEST VALUES (3, '5,200');
    COMMIT;
    2) Requête qui me ramène seulement les valeurs numérique qui teste si LOWER = UPPER, donc valable uniquement si ta colonne contient de l'alphanumérique !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT Numero, Epaisseur 
      FROM TEST
     WHERE UPPER(Epaisseur) = LOWER(Epaisseur);
     
        NUMERO EPAISSEUR
    ---------- -------------------------
             2 12,400
             3 5,200
    3) Requête finale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT Numero, Epaisseur 
       FROM (SELECT Numero, Epaisseur 
               FROM TEST
              WHERE UPPER(Epaisseur) = LOWER(Epaisseur))
      WHERE TO_NUMBER(Epaisseur) > 12;
     
        NUMERO EPAISSEUR
    ---------- -------------------------
             2 12,400
    Si cela te convient, il suffit :
    - de remplacer TO_NUMBER (spécifique à Oracle) par Num ou tout autre fonction de conversion de charactère en numérique,
    - de faire attention à la gestion des séparateurs décimaux ...

  3. #3
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 213
    Points : 154
    Points
    154
    Par défaut
    Oh merci de cette super "bidouille" ça merche c'est trop bien!!!

  4. #4
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Voila un probleme interessant et douloureusement resolvable avec du SQL
    Il existe des tas de methodes pour "verifier" qu'une colonne est de type numerique, mais la majorité ont des failles.

    Je reprends du ORACLE pour coller avec XO

    Celle de XO est simple mais SELECT UPPER('##') = SELECT LOWER('##').
    Comme ton champ est de type AlphaNumerique, tu ne peux assurer que ce resultat ne puisse arriver.

    Il y a aussi :

    select nvl(length(translate(trim('<ChaineDeCaracteres>'),' +-.0123456789',' ')),0)from dual

    Qui te renvoie >0 si ce n'est pas un nombre, mais si ChaineDeCaractere =1.1.1, alors la fonction te renverra 0 alors que ce n'est pas un nombre.

    Je pense que la solution la plus sure est de tester l'erreur de transtypage dans une procedure. Mais je ne sais pas si ACCESS possede ce systeme de procedure stockée.

    Une procédure du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE OR REPLACE FUNCTION isnumber(Char_valeur IN VARCHAR2) RETURN NUMBER IS
     
    Num_valeur NUMBER;
     
    BEGIN
       Num_valeur := TO_NUMBER(Char_valeur);
       RETURN 1;
    EXCEPTION WHEN VALUE_ERROR THEN
       RETURN 0;
    END;
    J'ai developpé un peu, meme si ca ne colle pas avec ACCESS, car moi aussi je me suis pris la "tete" sur ce genre de probleme et comme la connaissance se doit d'etre partagée ...

    bon courage

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par Yanika_bzh
    select nvl(length(translate(trim('<ChaineDeCaracteres>'),' +-.0123456789',' ')),0)from dual
    Heu... non c'est faux et je pense que tu as trouvé cette fonction écrite par LeoAnderson en faisant une recherche avancée sur le forum Oracle non ?

    Si c'est le cas tu as du trouver un post à la fin où j'explique pourquoi ce raisonnement est faux : il ne tient pas compte de la notion d'ordre et de fréquence de motifs dans un nombre.

    Ex : "-12.12-12", "12.....", "....", etc. sont considérés comme des nombres valides avec cette méthode

  6. #6
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Citation Envoyé par Magnus
    Heu... non c'est faux et je pense que tu as trouvé cette fonction écrite par LeoAnderson en faisant une recherche avancée sur le forum Oracle non ?

    Si c'est le cas tu as du trouver un post à la fin où j'explique pourquoi ce raisonnement est faux : il ne tient pas compte de la notion d'ordre et de fréquence de motifs dans un nombre.

    Ex : "-12.12-12", "12.....", "....", etc. sont considérés comme des nombres valides avec cette méthode
    C'est bien ce que j'explique !!

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par Yanika_bzh
    C'est bien ce que j'explique !!
    Effectivement, donc je supprime mon post et celui-là aussi après

    Heu... comment on fait pour supprimer ses messages avec le nouveau site ?

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

Discussions similaires

  1. [10g] ORA-06502: PL/SQL: numeric or value error: character to number conversion error
    Par MadoshiNatsu dans le forum Interfaces de programmation
    Réponses: 2
    Dernier message: 10/05/2013, 19h45
  2. [DATA] Comment convertir une variable Character en Numeric sous SAS?
    Par Maria_75 dans le forum SAS Base
    Réponses: 1
    Dernier message: 20/08/2012, 18h58
  3. Réponses: 13
    Dernier message: 05/12/2011, 15h09
  4. NLS NUMERIC CHARACTERS
    Par ahmedige dans le forum Oracle
    Réponses: 3
    Dernier message: 16/06/2011, 11h52
  5. [db2][sql]Transformer un character en numeric
    Par yoyopi dans le forum DB2
    Réponses: 7
    Dernier message: 24/04/2006, 09h20

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