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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 56
    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 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    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 chevronné 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
    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

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