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 :

[SQL Server] Concaténation de champs, oui mais. .


Sujet :

Langage SQL

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut [SQL Server] Concaténation de champs, oui mais. .
    Voici une requête toute simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT C1+'-'+C2+'-'+C3 FROM T0
    Le résultat est donc l'ensemble des enregistrements de T0 dont les champs C1, C2 et C3 sont concaténés via un séparateur.
    Oui mais voilà, il faudrait que les séparateurs n'apparaissent pas lorsque le champ qui le suit est vide (ou null) afin d'éviter un résultat du genre:
    -x2-
    x1--
    --x3
    x1-x2-
    x1--x3
    -x2-x3

    Il faudrait obtenir
    x2
    x1
    x3
    x1-x2
    x1-x3
    x2-x3

    Merci pour votre aide

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Vous ne précisez pas votre SGBD comme demandé dans les règles du forum donc voici une solution sous Oracle 10gR1 :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    10g SOC5> create table dvp (c1 varchar2(30), c2 varchar2(30), c3 varchar2(30));
     
    Table créée.
     
    10g SOC5> insert into dvp values (null, 'x2', null);
     
    1 ligne créée.
     
    10g SOC5> insert into dvp values ('x1', null, null);
     
    1 ligne créée.
     
    10g SOC5> insert into dvp values (null, null, 'x3');
     
    1 ligne créée.
     
    10g SOC5> insert into dvp values ('x1','x2', null);
     
    1 ligne créée.
     
    10g SOC5> insert into dvp values ('x1',null, 'x3');
     
    1 ligne créée.
     
    10g SOC5> insert into dvp values (null, 'x2','x3');
     
    1 ligne créée.
     
    10g SOC5> 
    10g SOC5> select c1 ||
      2  case when c1 is not null and (c2 is not null or c3 is not null) then '-' end ||
      3  c2 ||
      4  case when c2 is not null and c3 is not null then '-' end ||
      5  c3 as expr
      6  from dvp;
     
    EXPR
    --------------------------------------------------------------------------------------------
    x2
    x1
    x3
    x1-x2
    x1-x3
    x2-x3
     
    6 ligne(s) sélectionnée(s).
     
    10g SOC5>

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Merci, je vais déjà essayer cela
    Je précise aussi que les champs vides ne sont pas nécessairement null, ils peuvent être vraiment "vides" (chaine de longueur zéro).

    Et désolé de ne pas avoir précisé que c'était sous SQL Server, je pensais la réponse "standard".

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Traduit en SQL Server voici ce que cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT isnull(c1,'') +
     case
      when c1 IS NOT NULL AND (c2 IS NOT NULL OR c3 IS NOT NULL) then '-'
      else ''
     end +
     isnull(c2,'') +
     case
      when c2 IS NOT NULL AND c3 IS NOT NULL then '-'
      else ''
     end +
     isnull(c3,'')
     AS expr,*
     FROM dvp;
    Autre solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select
     isnull(c1+'-'+c2+'-'+c3,
     isnull(c1+'-'+c2,
     isnull(c1+'-'+c3,
     isnull(c2+'-'+c3,
     isnull(c1,
     isnull(c2,
     isnull(c3,''))))))) as expr,* from dvp
    Si quelqu'un a plus simple ou plus 'propre', merci de me le faire savoir

    PS: au préalable, j'aurais mis à NULL tous les champs qui sont vides (chaine de longueur zéro).

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/09/2006, 18h02
  2. Réponses: 3
    Dernier message: 28/08/2006, 16h14
  3. sql server 2000 - atteindre champ Null
    Par poosh dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 20/07/2006, 17h10
  4. [SQL Server] céer un champs AutoInc
    Par aityahia dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 03/07/2006, 09h52
  5. [SQL Server] insertion de champs depuis un requete
    Par bleuerouge dans le forum Langage SQL
    Réponses: 3
    Dernier message: 15/06/2006, 18h19

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