2012-06-22 5 views
0

J'essaye de faire du formatage de texte avec SQL (MS SQL Server 2008). J'ai trois variables qui vont renvoyer des chaînes vides ou une sorte de texte, elles ne seront jamais nulles. Je voudrais afficher le texte de la façon suivante:
@ Var1 = 'A' @ Var2 = 'B' @ Var3 = 'C' ==> A, B, C
@ Var1 = 'A' @ Var2 = '' @ Var3 = 'C' ==> A, C
@ Var1 = '' @ Var2 = 'B' @ Var3 = 'C' ==> B, C
@ Var1 = '' @ Var2 = '' @ Var3 = 'C' ==> C
.
.
.
@ Var1 = '' @ Var2 = '' @ Var3 = '' ==>
etcChaînes vides SQL et mise en forme du texte

Voici une version simplifiée de ce que j'ai ...

DECLARE @Var1 NVARCHAR(100) 
DECLARE @Var2 NVARCHAR(100) 
DECLARE @Var3 NVARCHAR(100) 
SET @Var1 = 'A' 
SET @Var2 = 'B' 
SET @Var3 = 'C' 
SELECT 
ISNULL(NULLIF(@Var1,''), '') 
    + 
     CASE 
      WHEN NULLIF(@Var1,'') IS NOT NULL AND NULLIF(@Var2,'') IS NOT NULL THEN ', ' ELSE '' 
     END 
    + 
ISNULL(NULLIF(@Var2,''),'') 
    + 
     CASE 
      WHEN NULLIF(@Var2,'') IS NOT NULL AND NULLIF(@Var3,'') IS NOT NULL THEN ', ' ELSE '' 
     END 
    + 
ISNULL(NULLIF(@Var3,''),'') 

Je me sens comme Je manque quelques détails importants. Faites-moi savoir si des éclaircissements sont nécessaires.

Répondre

3

Essayez:

select case 
     when str is null then '' 
     else left(str, len(str)-1) -- Remove last comma 
     end 
from (
     select case when len(@Var1) > 0 then @Var1 + ', ' else '' end + 
       case when len(@Var2) > 0 then @Var2 + ', ' else '' end + 
       case when len(@Var3) > 0 then @Var3 + ', ' else '' end as str 
     ) as SubQueryAlias 

Ou avec une astuce reverse pour éviter la sous-requête:

select reverse(stuff(reverse(
     case when len(@Var1) > 0 then @Var1 + ', ' else '' end + 
     case when len(@Var2) > 0 then @Var2 + ', ' else '' end + 
     case when len(@Var3) > 0 then @Var3 + ', ' else '' end 
     ), 1, 2, '')); 

Le point clé est que SQL Server n'est pas très bon au formatage du texte :) Vous êtes infiniment mieux dans une langue côté client comme C#.

Live example at SQL Fiddle.

+0

N'oubliez pas de supprimer la virgule finale. –

+0

Malheureusement, je n'ai pas cette option disponible parce que l'arrière-plan est qu'un webservice appelle une procédure stockée et la conversion de ce qu'il renvoyé à xml, il n'y a pas de place pour utiliser un langage côté client. –

+0

@ user1401635 - Et qu'est-ce qui consomme le XML? Est-ce que cela pourrait faire trois choses au lieu d'une? ' xxx yyy'? – MatBailie

Questions connexes