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 :

Clause SELECT dans un CASE WHEN THEN


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 42
    Points : 12
    Points
    12
    Par défaut Clause SELECT dans un CASE WHEN THEN
    Bonjour,

    J'ai cette requête qui m'affiche les pays de résidence de chacun de mes élèves mais sous forme de code pays :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CASE WHEN MATABLE.ELEVE.ADRESSE_ID IS NULL THEN 
    (SELECT MATABLE.PAYS.CODE_PAYS FROM MATABLE.PAYS WHERE MATABLE.PAYS.PAYS_ID =
    	   (SELECT MATABLE.ADRESSE.PAYS_ID
    			   FROM MATABLE.ADRESSE WHERE MATABLE.ADRESSE.ADRESSE_ID = MATABLE.PERSONNE.ADRESSE_ID))
    ELSE
    SELECT MATABLE.PAYS.CODE_PAYS FROM MATABLE.PAYS WHERE MATABLE.PAYS.PAYS_ID =
    	   (SELECT MATABLE.ADRESSE.PAYS_ID FROM MATABLE.ADRESSE WHERE MATABLE.ADRESSE.ADRESSE_ID = MATABLE.ELEVE.ADRESSE_ID))
    END                                                        AS PAYS_RESIDENCE,
    J'aimerais rajouter un CASE WHEN pour transformer mes code 105 en France, mes codes 112 en Allemagne, etc ....

    J'ai tenté plusieurs choses mais à chaque fois ça ne fonctionne pas.

    Quelqu'un saurait comment faire que mon CASE WHEN fonctionne dans cette requête svp ?

    Cordialement.
    Ludo

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Je n'arrive pas bien à comprendre ce que tu essayes de faire dans ce morceau de code mais peut-être as-tu besoin simplement d'une jointure (éventuellement externe).

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 777
    Points
    10 777
    Par défaut
    Bonjour cela me semble simple ce que tu veux mais c'est très mal expliqué … Pourrais-tu nous montrer le modèle de donnée et le résultat voulu (exemple) ?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 42
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    En fait j'ai fais une requête qui me liste tous les élèves que j'ai en base en affichant tous les champs que j'ai choisi . Et l'un de ses champs est le pays de résidence. Mais plutôt que de m'afficher le pays de residence sous forme de code a 3 chiffres comme cest le cas actuellement je voudrais mettre en place un case when afin de remplacer chaque code à 3 chiffres par son véritable nom. Ex "105" pour "France".

    Je ne peux pas te donner un exemple du résultats souhaité car là requête est au travail.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    En ce cas, c'est bien une jointure qu'il faut utiliser.

    Soit les tables suivantes :
    EL_eleve(EL_ident, EL_nom, EL_prenom, ..., PY_ident#) avec PY_ident# qui fait référence à l'identifiant PK de la table PY_pays
    PY_pays(PY_ident, PY_code, PY_libelle, ...)

    La requête qui suit fera l'affaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT EL.EL_nom     as nom_eleve
         , EL.EL_prenom  as prenom_eleve
         , ...
         , PY.PY_code    as code_pays
         , PY.PY_libelle as lib_pays
    from       el_eleve as EL
    inner join py_pays  as PY
       on PY.PY_ident = EL.PY_ident
    order by ...
    Note : avoir l'identifiant du pays en clef étrangère dans la table des éleves est correct s'il s'agit du pays de naissance, mais pas s'il s'agit du pays du domicile. Car en ce cas, cette FK devrait être positionnée dans la table adresse.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 42
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Merci escartefigue, je vais regarder ça dans la journée et je viendrai vous dire ce que ça a donné.

    Bonne journée et merci encore.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 42
    Points : 12
    Points
    12
    Par défaut
    Les INNER JOIN fonctionnent bien merci.

    En revanche maintenant que j'ai tout mes résultats de code pays (100,105,132,148,251,321, ...) Comment je peux faire pour afficher le nom du pays plutôt que le code ???

    Sachant que les correspondances code pays ou code ville et nom pays/villes sont dans un fichier pdf à part ... Et nulle part en base de données ...

    D'avance merci pour votre aide.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 777
    Points
    10 777
    Par défaut
    Il faudrait créer des tables de correspondance dans la base de donnée entre code et libellé, sinon ça sera très fastidieux …

    sinon via un case (mais vraiment déconseillé pour ce cas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Case PY.PY_code
    when '105' then 'France'
    when '112' then 'Allemagne'end as LIB_PAYS

  9. #9
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 42
    Points : 12
    Points
    12
    Par défaut
    Je pensais justement faire un case mais c'est lourd ......

    Je vais regarder du côté table de correspondance alors ... c'est compliqué à mettre en place ??

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    Non, coté table, c'est très simple, cette table aura très peu de colonnes

    A priori les suivantes (noms à adapter) :
    PY_ident integer Primary Key <-- attribué par le SGBD (identity ou auto_increment selon le SGBD)
    PY_code_iso char(2) ou char(3) cf. code ISO 3166 (il en existe 3 nomenclatures disponibles sur le web)
    PY_libelle libellé du pays
    PY_dtdeb date de début de validité
    PY_dtfin date de fin de validité pour les pays n'existant plus (haute volta, dahomey...)
    et les colonnes classiques (user de création et de mise à jour et horodatages correspondants)

    Par contre, il faut que les traitements qui insèrent des adresses dans la table "adresse" ou des pays de naissance dans la table "personne", récupèrent l'identifiant PY_ident par recherche sur le code pays PY_code_iso afin d'insérer la bonne valeur de FK dans "adresse" ou "personne". Il faut donc concevoir un service qui récupère cet identifiant à partir du code .

  11. #11
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2018
    Messages : 42
    Points : 12
    Points
    12
    Par défaut
    Ok bien bon je vais regarder tout ça et ce serait pas mal de faire comme ça ;-)

    Merci beaucoup pour toutes ses infos.

Discussions similaires

  1. problème case when then jpql
    Par hadmarin dans le forum Persistance des données
    Réponses: 0
    Dernier message: 08/09/2011, 11h31
  2. Hibernate HQL : CASE WHEN THEN
    Par hisoft dans le forum Autres
    Réponses: 3
    Dernier message: 12/04/2011, 22h31
  3. Réponses: 1
    Dernier message: 10/05/2009, 03h07
  4. Réponses: 5
    Dernier message: 24/10/2008, 10h20
  5. Equivalent "Select Case when then else end" sur Paradoxe
    Par Seuh.m dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/06/2006, 09h23

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