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 :

Utilisation du "replace"


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 56
    Points : 52
    Points
    52
    Par défaut Utilisation du "replace"
    Bonjour,
    J'ai une erreur sous un serveur oracle, que j'ai du mal a comprendre.
    Voici la requête que j'effectue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * from TestVue WHERE REPLACE (TestVue.Row2, '.', ',') > 0 ;
    Les valeurs qui se trouvent dans TestVue.Row2 sont par exemple les suivantes: '46.08','-46.47','1084.05','66500',...
    Chaque fois que j'effectue la requête dans oracle sql developer j'ai l'erreur suivante:
    ORA-01722: invalid number
    01722. 00000 - "invalid number"
    *Cause:
    *Action:

    Si quelqu'un a une idée du problème. Merci d'avance pour votre aide

    Cordialement,
    Zoners

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Vous avez des conversions implicites, la partie filter du plan d'exécution permet de le mettre en évidence :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    SQL> desc t;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     C                                                  VARCHAR2(10)
     
    SQL> select c, REPLACE (c, '.', ',') from t
      2  where REPLACE (c, '.', ',') > 0;
     
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1601196873
     
    --------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     3 |    21 |     2   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T    |     3 |    21 |     2   (0)| 00:00:01 |
    --------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter(TO_NUMBER(REPLACE("C",'.',','))>0)
     
    Note
    -----
       - dynamic sampling used for this statement (level=2)
     
    SQL>
    Donc vous avez une valeur dans votre colonne qui ne peut pas se transformer en nombre.
    En comparant avec la chaîne '0', la conversion implicite to_number disparaît :
    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
    18
    19
    20
    21
    22
    SQL> select c, REPLACE (c, '.', ',') from t
      2  where REPLACE (c, '.', ',') > '0';
     
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1601196873
     
    --------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     3 |    21 |     2   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T    |     3 |    21 |     2   (0)| 00:00:01 |
    --------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter(REPLACE("C",'.',',')>'0')
     
    Note
    -----
       - dynamic sampling used for this statement (level=2)
    Mais quel est votre objectif ?

    Pour la forme, même si la colonne est du number, comme REPLACE prend un varchar en entrée, il y a double conversion implicite :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    SQL> desc t2;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     C                                                  NUMBER
     
    SQL> select c, REPLACE (c, '.', ',') from t2
      2  where REPLACE (c, '.', ',') > 0;
     
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1513984157
     
    --------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     3 |    39 |     2   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T2   |     3 |    39 |     2   (0)| 00:00:01 |
    --------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter(TO_NUMBER(REPLACE(TO_CHAR("C"),'.',','))>0)
     
    Note
    -----
       - dynamic sampling used for this statement (level=2)
     
    SQL>

  3. #3
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    au pire si tu veux pas les négatifs et le 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT * FROM TestVue WHERE  TestVue.Row2 not like '-%' and TestVue.Row2 != '0' ;
    Ça ne résout pas le problème de fond cela dit
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/11/2006, 18h00

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