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 :

Problème fonction replace


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Par défaut Problème fonction replace
    Bonjour,

    Je fais habituellement un extraction SQL pour obtenir une liste exploitable à partir d'une application. Mais récemment l'application a modifié des données par défaut pour certains champs, faisant passer la valeur par défaut de '999' à ' '.

    Voici mon ancien script d'extraction :
    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
    select 'M' || a.matric,b.etctit,b.etnomu,b.etpren,c.prufon,
    a.prgrgrrm,e.libelle,c.PRNEFEX,g.liblong,c.PRAFEMP,h.liblong
     from chm_ppr a,pet b,chm_ppra c,chm_tli d,chm_tli e,chm_tli f,chm_tli g,chm_tli h
    where a.nompop='AGJOUR'
      and c.nompop='AGJOUR'
      and b.codhop='010'
      and a.presmods in ('   ','GC ')
      and a.matric=b.matric
      and a.matric=c.matric
      and c.praftp='P'
      and c.prufon=d.valeur
      and d.rubcod='PAFUFON'
      and a.prgrgrrm=e.valeur
      and e.rubcod='PGRGRAD'
      and c.tufcres=f.valeur
      and f.rubcod='TUFCRES'
      and c.prnefex=g.valeur
      and g.rubcod='PAFEMPL'
      and c.prafemp=h.valeur
      and h.rubcod='PAFFONC'
    order by b.etnomu,b.etpren,a.matric;
    Les champs pour lesquels le paramètre par défaut est passé de '999' à ' ' sont les 2 champs en rouge.

    Je dois donc modifier mon script pour prendre en compte les lignes comprenant ' ' comme valeur par défaut en plus de '999'. Mais le problème c'est que d'autres champs du script n'acceptent pas que ces champs soient ' ' car il n'y a pas de correspondance et pas moyen d'en rajouter avec cette valeur ' ' dans l'application.

    Je voulais donc utiliser la fonction replace pour transformer (juste pour mon extraction) les valeurs ' ' pour ces 2 champs (prnefex et prafemp) en '999', l'ancienne valeur par défaut, reconnue par les autres champs. La fonction replace marche dans le select, mais elle ne marche pas en revanche en étant placée dans la cause where, aucune ligne n'est obtenue. Si j'enlève les replace du where, la liste obtenue ne prendra pas compte des lignes dont la valeur par défaut est ' '. Que faire ?

    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
    select 'M' || a.matric,b.etctit,b.etnomu,b.etpren,c.prufon,
    a.prgrgrrm,e.libelle,replace(c.prnefex,' ',9),g.liblong,replace(c.prafemp,' ',9),h.liblong
     from chm_ppr a,pet b,chm_ppra c,chm_tli d,chm_tli e,chm_tli f,chm_tli g,chm_tli h 
    where a.nompop='AGJOUR'
      and c.nompop='AGJOUR'
      and b.codhop='010'
      and a.presmods in ('   ','GC ')
      and a.matric=b.matric
      and a.matric=c.matric
      and c.praftp='P'
      and c.prufon=d.valeur
      and d.rubcod='PAFUFON'
      and a.prgrgrrm=e.valeur 
      and e.rubcod='PGRGRAD'
      and c.tufcres=f.valeur
      and f.rubcod='TUFCRES'
      and replace(c.prnefex,' ',9)=g.valeur
      and g.rubcod='PAFEMPL'
      and replace(c.prafemp,' ',9)=h.valeur
      and h.rubcod='PAFFONC'
    order by b.etnomu,b.etpren,a.matric;
    Merci de m'indiquer si vous avez une solution pour résoudre ce problème, car moi je sature, peut-être que je suis trop fatigué en ce vendredi.

    Cordialement,

    Seb

  2. #2
    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
    Vous demandez :
    replace pour transformer les valeurs ' ' en '999'
    Vous écrivez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    replace(c.prnefex,' ',9)
    La solution est dans votre demande !

  3. #3
    Membre éprouvé
    Inscrit en
    Février 2009
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 127
    Par défaut
    Bonjour,

    Pour ma part, j'aurais utilisé le decode plutot que replace.
    Mais ça ne change rien à mon avis.

    La remarque de Waldar est sûrement la solution.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    replace(c.prnefex,' ',9)
    La solution est dans votre demande !
    C'est bien ce que j'utilise (voir le 2ème code) mais avec ce code placé dans ma clause where, je n'obtiens aucune ligne ! le code ne semble pas marché après where.

  5. #5
    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
    Vous n'avez pas compris ce que j'essaie de vous faire comprendre.
    J'indique les indices.

    replace pour transformer les valeurs ' ' en '999'
    REPLACE(c.prnefex,' ',9)
    Ne percevez-vous pas une différence entre votre demande et votre écriture en SQL ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Ne percevez-vous pas une différence entre votre demande et votre écriture en SQL ?
    En fait dans ma demande j'indique vouloir remplacer ' ' par '999' car le champ en question est un champ numérique à 3 chiffres, mais dans le code j'indique remplacer ' ' par 9 puisque la fonction remplacera tous les ' ' par 9, donc comme le champ est de longueur 3 chiffres, je devrait obtenir 999. Le résultat devrait donc être le même, mais pour plus de précision j'aurai du indiquer le même chiffre dans le commentaire et le code.

    Mais de toute façon, dans tous les cas de figure la fonction replace de ma clause where ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     ... replace(c.prnefex,' ',9)=g.valeur ...
    ou
    ... replace(c.prnefex,' ','9')=g.valeur ...
    ou
    ... replace(c.prnefex,' ',999)=g.valeur ...
    ou
    ... replace(c.prnefex,' ','999')=g.valeur ...
    Dans chaque cas le script ne me retourne aucune lignes ('No rows').

    Le problème reste donc entier ...

  7. #7
    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
    Votre champ est numérique ???
    Vous êtes sûr de ne pas confondre ' ' et null ?

    Pouvez-vous nous donner le type des trois champs suivants :
    chm_tli.valeur
    chm_ppra.prnefex
    chm_ppra.prafemp

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    et en remplaçant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     and replace(c.prnefex,' ',9)=g.valeur
    Par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     and g.valeur IN (c.prnefex, '999')
    Sinon, supprime cette condition et regarde les valeurs de ton champs... si ça se trouve c'est ni ' ' ni '999'

    Et ton g.valeur t'es sûr que c'est 999 ?

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

Discussions similaires

  1. Problème avec la fonction REPLACE
    Par Hanshorcan dans le forum Développement
    Réponses: 6
    Dernier message: 24/08/2011, 21h57
  2. [AC-2003] Problème fonction replace()
    Par 0inm3 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 08/06/2010, 14h06
  3. Problème avec Fonction REPLACE
    Par Minhy dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 01/08/2008, 19h14
  4. Réponses: 5
    Dernier message: 17/09/2007, 17h01
  5. [ODBC] Fonction Replace en ODBC
    Par Alexandre T dans le forum Access
    Réponses: 4
    Dernier message: 10/01/2007, 11h02

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