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

MS SQL Server Discussion :

[MSSQL2k5] Comment faire un isnull() sur plusieurs champs


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Inscrit en
    Mars 2007
    Messages
    218
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 218
    Points : 216
    Points
    216
    Par défaut [MSSQL2k5] Comment faire un isnull() sur plusieurs champs
    Bonjour,

    Je cherche à faire un isnull(champ1, champ2, champ3, champ4...) en sql.
    Equivalent à cet algo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
         si champ1 est null
              si champ2 est null
                   si champ3 est null
                        si champ4 est null
                        alors ne rien afficher
                        sinon affichier champ4
                   sinon afficher champ3
              sinon afficher champ2
         sinon afficher champ1
    isnull() ne prend normalement que 2 paramètres.

    Des idées ?

    Merci d'avance

  2. #2
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    As tu testé la solution (ou quelque chose du style) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    isnull(champ1,isnull(champ2,isnull(champ3,champ4)))

  3. #3
    Membre actif
    Inscrit en
    Mars 2007
    Messages
    218
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 218
    Points : 216
    Points
    216
    Par défaut
    Héhé merci pour ta réponse rapide mais j'étais justement en train de tester cette solution. Erreur SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    The isnull function requires 2 argument(s).

  4. #4
    Membre actif
    Inscrit en
    Mars 2007
    Messages
    218
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 218
    Points : 216
    Points
    216
    Par défaut
    J'ai trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select blabla, isnull(champ1, '') + ' ' + isnull(champ2, '') + ' ' + isnull(champ3, '') + ' ' + isnull(champ4, '') + ' ' + etc...
    from matable
    Il s'agit en fait de concaténation de plusieurs champs.
    Cf. 'Isnull concatenation on SQL Server' @ http://comstock-software.com/blogs/rdp/

  5. #5
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    D'accord avec ta solution, cependant elle ne répond pas à l'algo de base que tu spécifies dans ton premier post.

    La concatenation risque de te retourner :
    champ1 + ' ' + champ2 + ' ' + champ4 (si l'on considere que le champ3 est null)

    Alors que ton algo de base aurait juste retourné :
    champ1

    Si c'est ok pour toi, pas de soucis.


    EDIT :
    Si tu connais les différentes valeurs qui peuvent etre contenue dans tes champs, et qu'il n'y a pas d'espace, garde l'espace comme caractere de séparation avec tes différents champs, tu pourras y revenir par après. Si tes champs peuvent contenir des espaces, je te dirais de travailler avec un caractere séparateur unique, que tu sais ne pas retrouver dans tes champs, ca te permettra de pouvoir séparer tes champs plus facilement apres la concatenation.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 874
    Points : 53 048
    Points
    53 048
    Billets dans le blog
    6
    Par défaut
    ISNULL est une fonction propre à SQL Server et ne répond par à votre problématique. Utilisez COALESCE qui est la norme SQL et répond à votre demande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
         si champ1 est NULL
              si champ2 est NULL
                   si champ3 est NULL
                        si champ4 est NULL
                        alors ne rien afficher
                        sinon affichier champ4
                   sinon afficher champ3
              sinon afficher champ2
         sinon afficher champ1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COALESCE(Colonne1, Colonne2, Colonne3, Colonne4)
    Tout simplement.

    Lisez les articles que j'ai écrit à ce sujet :
    sur COALESCE :
    http://sqlpro.developpez.com/cours/sqlaz/select/#L5.2
    Sur le NULL :
    http://sqlpro.developpez.com/cours/null/

    A +

  7. #7
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    ISNULL est une fonction propre à SQL Server et ne répond par à votre problématique. Utilisez COALESCE qui est la norme SQL et répond à votre demande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
         si champ1 est NULL
              si champ2 est NULL
                   si champ3 est NULL
                        si champ4 est NULL
                        alors ne rien afficher
                        sinon affichier champ4
                   sinon afficher champ3
              sinon afficher champ2
         sinon afficher champ1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COALESCE(Colonne1, Colonne2, Colonne3, Colonne4)
    Tout simplement.

    Lisez les articles que j'ai écrit à ce sujet :
    sur COALESCE :
    http://sqlpro.developpez.com/cours/sqlaz/select/#L5.2
    Sur le NULL :
    http://sqlpro.developpez.com/cours/null/

    A +

    Je n'utilise pas cette fonction.
    Interessant de la connaitre !
    Merci pour l'info

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/11/2006, 12h08
  2. Comment faire un Tri sur plusieurs champs
    Par guile153 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/07/2006, 12h52
  3. [ADO.NET]Comment réaliser une relation sur plusieurs champs?
    Par kleomas dans le forum Accès aux données
    Réponses: 3
    Dernier message: 13/03/2006, 12h40
  4. Réponses: 6
    Dernier message: 15/02/2006, 19h29

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