[ORACLE] Remplacement de valeurs "NULL"

Remplacement de valeurs "NULL" [ORACLE] - SQL/NoSQL - Programmation

Marsh Posté le 01-12-2011 à 12:08:03    

Salut :)
 
J'ai actuellement une base Oracle, un truc assez gros, et en résultat de requête j'ai à peu près ce schéma là :
 
... | id_user | nom
 
    | 01234  | bla
 
mais de temps en temps j'ai id_user = "NULL", mais pour le coup quand je fais correspondre l'id avec le nom il ne me sort que les résultats pour lesquels il y a correspondance... La question serait :
 
Comment faire pour que je puisse avoir les valeurs "null" conservées dans l'affichage ? (pour avoir ça : )
 
... | id_user | nom
 
    | 01234  | bla
    | null      | -vide-
 
Une petite idée ?


---------------
http://www.kevintran.fr
Reply

Marsh Posté le 01-12-2011 à 12:08:03   

Reply

Marsh Posté le 01-12-2011 à 15:17:03    

Oui, mais donne d'abord un exemple de requête  :)


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 01-12-2011 à 15:18:47    

Sinon la réponse est probablement LEFT JOIN, mais sans requête pour illustrer c'est loin d'être limpide.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 01-12-2011 à 15:42:59    

Je voulais pas donner une requête direct, c'est vrai que j'ai déjà des jointures faites entre les tables :
 

Code :
  1. select d.codsecteur as secteur, d.nuddeext as numero_demande, er.codrefexam as examen, c.nomenclature as code_ccam,
  2.   ec.datrealisation as daterealisation, u.abrutil as lecteur1, sec.abrutil as nomsecretaire
  3. /* , r.nulec2 as lecteur2 */
  4. from diamic.examencot ec, diamic.cotationelem c, diamic.examen e, diamic.demande d, diamic.origine o, diamic.secteur,
  5. diamic.exploitant, diamic.examenref er, diamic.utilisateur u, diamic.resultat r, diamic.utilisateur sec
  6. /* , diamic.utilisateur lec2 */
  7. where ec.nucot = c.nucot and ec.nuexam = e.nuexam and e.nudde = d.nudde and d.nuorig=o.nuorig and u.nuutil=d.nulec
  8. and ec.datrealisation between to_date('01/09/2011','DD/MM/YYYY') and to_date('30/11/2011','DD/MM/YYYY')
  9. and (o.codcatorig like '%') and (c.nomenclature like '%') and (d.codsecteur like '%') and (exploitant.codexploit like '%')
  10. and (c.coeff*ec.qteadm <>0) and c.lettrecle in ('F')
  11. and d.codsecteur = 'S'
  12. and e.nurefexam = er.nurefexam
  13. and d.nudde = r.nudde
  14. and r.nusecretaire = sec.nuutil
  15. /* and r.nulec2 = lec2.nuutil */
  16. and (er.codrefexam = 'OHDCPY' or er.codrefexam = 'OHOTYT')
  17. and d.codsecteur=secteur.codsecteur and exploitant.nuexploit=secteur.nuexploit
  18. order by numero_demande,daterealisation


 
Le truc c'est que j'utilise plusieurs fois la même table (utilisateur), ça fonctionne bien pour le lecteur et la secrétaire.
En gros ce sont des Compte rendus médicaux qui sont lus par plusieurs personnes et la requête sert à ressortir le nom des 3 lecteurs et de la secrétaire => ça fonctionne bien pour le lecteur 1 et la secrétaire qui sont obligatoirement renseignés, mais je n'arrive pas à sortir les autres (conversion n° utilisateur vers le nom) car leur valeur peut être 'null'.
 
 
/* utilisateur : contient l'id et le nom
    resultat : contient les id des gens qui ont lu (lecteur 1, 2, 3, secrétaire) */
 
ça fait un petit moment que j'essaye mais j'y arrive pas :(
Le plus gros souci c'est d'avoir la correspondance n° > nom même pour les valeurs 'null' (qui doivent sortir)


---------------
http://www.kevintran.fr
Reply

Marsh Posté le 01-12-2011 à 15:51:32    

Un truc du genre :

Code :
  1. SELECT   d.codsecteur AS secteur, d.nuddeext AS numero_demande,
  2.          er.codrefexam AS examen, c.nomenclature AS code_ccam,
  3.          ec.datrealisation AS daterealisation, u.abrutil AS lecteur1,
  4.          sec.abrutil AS nomsecretaire,
  5.          r.nulec2 as lecteur2,
  6.          lec2.abrutil AS nomlecteur2
  7.     FROM diamic.examencot ec,
  8.          diamic.cotationelem c,
  9.          diamic.examen e,
  10.          diamic.demande d,
  11.          diamic.origine o,
  12.          diamic.secteur,
  13.          diamic.exploitant,
  14.          diamic.examenref er,
  15.          diamic.utilisateur u,
  16.          diamic.resultat r,
  17.          diamic.utilisateur sec,
  18.          diamic.utilisateur lec2
  19.    WHERE ec.nucot = c.nucot
  20.      AND ec.nuexam = e.nuexam
  21.      AND e.nudde = d.nudde
  22.      AND d.nuorig = o.nuorig
  23.      AND u.nuutil = d.nulec
  24.      AND ec.datrealisation BETWEEN TO_DATE( '01/09/2011', 'DD/MM/YYYY' )
  25.                                AND TO_DATE( '30/11/2011', 'DD/MM/YYYY' )
  26.      AND( o.codcatorig LIKE '%' )
  27.      AND( c.nomenclature LIKE '%' )
  28.      AND( d.codsecteur LIKE '%' )
  29.      AND( exploitant.codexploit LIKE '%' )
  30.      AND( c.coeff * ec.qteadm <> 0 )
  31.      AND c.lettrecle IN( 'F' )
  32.      AND d.codsecteur = 'S'
  33.      AND e.nurefexam = er.nurefexam
  34.      AND d.nudde = r.nudde
  35.      AND r.nusecretaire = sec.nuutil
  36.      AND r.nulec2 = lec2.nuutil(+)
  37.      AND( er.codrefexam = 'OHDCPY'
  38.           OR er.codrefexam = 'OHOTYT' )
  39.      AND d.codsecteur = secteur.codsecteur
  40.      AND exploitant.nuexploit = secteur.nuexploit
  41. ORDER BY numero_demande, daterealisation


 
le (+) a coté de "lec2.nuutil", c'est la syntaxe d'oracle pour le Left Join.
En gros, Lire : Si pas d'enregistrement en ajouter un avec NULL.
 
A+


Message édité par Mara's dad le 01-12-2011 à 15:53:54

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 02-12-2011 à 09:33:38    

Merci beaucoup ça fonctionne :)
J'avais déjà tenté le (+) mais je l'avais écrit : (+)= au lieu de le mettre juste à côté du champ.


---------------
http://www.kevintran.fr
Reply

Marsh Posté le 03-12-2011 à 14:14:54    

heu non le (+) sous oracle c'est pour faire une jointure externe
suivant où tu le place il est jointure externe gauche ou jointure externe droite

Reply

Marsh Posté le 03-12-2011 à 17:33:28    

couak a écrit :

heu non le (+) sous oracle c'est pour faire une jointure externe
suivant où tu le place il est jointure externe gauche ou jointure externe droite


Je pense que l'erreur était de faire :
r.nulec2 =(+) lec2.nuutil
Au lieu de :
r.nulec2 = lec2.nuutil(+)


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed