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 :

Concaténation avec chaine potentiellement vide


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    autodidacte / éternel débutant
    Inscrit en
    Avril 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : autodidacte / éternel débutant

    Informations forums :
    Inscription : Avril 2018
    Messages : 64
    Points : 43
    Points
    43
    Par défaut Concaténation avec chaine potentiellement vide
    Bonjour,
    Ma table 't_auteur' contient les champs 'nom', 'prénom', 'surnom'. Tous les auteurs ont un nom et un prénom, mais seulement certains ont un surnom (default : chaîne vide).
    Je cherche à obtenir une colonne 'auteur' qui ressemble à : Durant, Michel (duduche) ou, si 'surnom' est vide : Dupont, Pierre
    Existe-t-il une fonction de concaténation qui omet les séparateurs '(' et ')' si le champ 'surnom' est vide?
    J'arrive à ce que je souhaite avec :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT
    CASE surnom
         WHEN '' THEN CONCAT (nom, ', ', prenom)
         ELSE CONCAT (nom, ', ', prenom, ' (', surnom, ')' ) 
    END auteur
    Une solution plus simple ?
    J'avais de grands espoirs en trouvant CONCAT_W qui accepte plusieurs séparateurs différents, mais je n'arrive pas à obtenir le résultat que j'attends.
    Merci!

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 928
    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 928
    Points : 51 738
    Points
    51 738
    Billets dans le blog
    6
    Par défaut
    La norme SQL considère que CONCAT et CONCAT_WS doivent toujours renvoyer une chaine vide lorsqu'un argument est NULL. Quel est votre SQGD ?
    Sinon, utilisez COALESCE.

    A +

  3. #3
    Membre du Club
    Homme Profil pro
    autodidacte / éternel débutant
    Inscrit en
    Avril 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : autodidacte / éternel débutant

    Informations forums :
    Inscription : Avril 2018
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    Merci pour votre réponse,
    SGDB : MySql
    J'ai compris que COALESCE cherche une valeur NULL (je me trompe?). Considère-t-il une chaîne vide comme NULL?
    J'ai tenté :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT  CONCAT (nom, ', ', prenom, COALESCE (CONCAT (' (', surnom, ')'),''))
    et j'obtiens : Dupont, Pierre () quand 'surnom' est vide

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    vous pouvez faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT CONCAT(nom, ',' , prenom, COALESCE(CONCAT(' (', surnom , ')'), ''))

  5. #5
    Membre du Club
    Homme Profil pro
    autodidacte / éternel débutant
    Inscrit en
    Avril 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : autodidacte / éternel débutant

    Informations forums :
    Inscription : Avril 2018
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    Merci pour la suggestion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CONCAT(nom, ',' , prenom, COALESCE(CONCAT(' (', surnom , ')'), ''))
    ça donne le résultat escompté pour 'surnom' = NULL
    Mais j'ai toujours Dupont,Pierre () (manque un espace, oui je pinaille) quand la chaîne 'surnom' est vide (et pas NULL) alors que j'attends Dupont, Pierre

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    alors, on peut remplacer la chaine vide par du NULL pour que ça fonctionne : NULLIF(surnom, '')) mais... on arrive à une solution presque plus compliquée que votre solution initiale.

  7. #7
    Membre du Club
    Homme Profil pro
    autodidacte / éternel débutant
    Inscrit en
    Avril 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : autodidacte / éternel débutant

    Informations forums :
    Inscription : Avril 2018
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    L'idée est pertinente, la conclusion aussi : j'y avais également pensé et étais arrivé à la même conclusion.
    Mon CASE WHEN est-il plus gourmand en ressource qu'un simple COALESCE ?
    Si pas, tant pis pour la complexité (relative) de l'expression, je m'en contenterai.
    Si oui, je peux remplacer les champs 'surnom' vides de la table 'auteur' par des champs NULL sans trop de conséquences pour la gestion de ma base.
    Qu'en pensez-vous ?

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    COALESCE est une version abrégée de CASE WHEN.

    La définition (récursive) de COALESCE est la suivante :
    COALESCE(a,b,...,z) <=> CASE WHEN a IS NOT NULL THEN a ELSE COALESCE(b,...z) END.

    les performances devraient être les mêmes. Par ailleurs, le cout des CASE (ou COALESCE) devrait être minime pour la requête en question.

  9. #9
    Membre du Club
    Homme Profil pro
    autodidacte / éternel débutant
    Inscrit en
    Avril 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : autodidacte / éternel débutant

    Informations forums :
    Inscription : Avril 2018
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    Merci !
    Réponse instructive à une question bête, Ouf !

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 928
    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 928
    Points : 51 738
    Points
    51 738
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    COALESCE est une version abrégée de CASE WHEN.

    La définition (récursive) de COALESCE est la suivante :
    COALESCE(a,b,...,z) <=> CASE WHEN a IS NOT NULL THEN a ELSE COALESCE(b,...z) END.

    les performances devraient être les mêmes. Par ailleurs, le cout des CASE (ou COALESCE) devrait être minime pour la requête en question.

    Les performances dépendent du SGBDR utilisé. Certains optimisent le CASE, d'autres pas….

    A +

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/01/2008, 11h10
  2. Comment concaténer une chaine de caractères avec un espace ?
    Par blanchonvincent dans le forum MATLAB
    Réponses: 6
    Dernier message: 07/04/2007, 22h53
  3. Boucle avec chaine vide : je comprends pas
    Par Zapan dans le forum Langage
    Réponses: 8
    Dernier message: 14/02/2007, 18h27
  4. Construire une chaine avec plusieurs espaces vides
    Par imane_bennouna dans le forum Langage
    Réponses: 10
    Dernier message: 04/08/2006, 10h29
  5. Réponses: 4
    Dernier message: 25/10/2005, 21h42

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