Comment puis-je supprimer les champs NULL de l'instruction CONCAT?

Je concatène quelques champs de strings en utilisant la fonction CONCAT (). Voici le code:

CONCAT(a.[OrganizationalUnit], ' - ', a.[Level1], ' - ', a.[Level2], ' - ', a.[Level3], ' - ', a.[Level4], ' - ', a.[Level5], ' - ', a.[Level6], ' - ', a.[Level7], ' - ', a.[Level8], ' - ', a.[Level9], ' - ', a.[Level10], ' - ', a.[Level11], ' - ', a.[Level12], ' - ', a.[Level13], ' - ', a.[Level14]) AS Organization 

Il y a des champs qui sont null. Lorsque cela se produit, je reçois une série de tirets dans la sortie. Y a-t-il un moyen de m'en débarrasser lorsque les champs sont vides? Voici un exemple de sortie:

Société123 – Pays – LC BR – BR – RCL – 5510-RC BR (V) – EM – DG – – – – – – –

    Entourez vos champs avec une instruction if:

     (IF (field not null) then field) 

    Il suffit d'imbriquer ' - '+a.Leveln dans chaque partie de la concaténation.

     Declare @YourTable table ([OrganizationalUnit] varchar(10),Level1 varchar(10),Level2 varchar(10),Level3 varchar(10),Level4 varchar(10),Level5 varchar(10),Level6 varchar(10),Level7 varchar(10),Level8 varchar(10),Level9 varchar(10),Level10 varchar(10),Level11 varchar(10),Level12 varchar(10),Level13 varchar(10),Level14 varchar(10),Level15 varchar(10)) Insert Into @YourTable (OrganizationalUnit,Level1,Level2) values ('Org Unit','LevelOne','LevelTwo') Select CONCAT(a.[OrganizationalUnit], ' - '+a.[Level1], ' - '+ a.[Level2], ' - '+ a.[Level3], ' - '+ a.[Level4], ' - '+ a.[Level5], ' - '+ a.[Level6], ' - '+ a.[Level7], ' - '+ a.[Level8], ' - '+ a.[Level9], ' - '+ a.[Level10], ' - '+ a.[Level11], ' - '+ a.[Level12], ' - '+ a.[Level13], ' - '+ a.[Level14]) From @YourTable A 

    Résultats

     Org Unit - LevelOne - LevelTwo 

    Vous n'avez pas spécifié la version du server SQL, donc je suppose SQL Server 2012 ou plus récent et j'utilise iif (instant if) qui est disponible dans SQL 2012 ou plus récent. Voir plus d'infos sur MSDN

    La solution ci-dessous utilise des variables, juste pour montrer du code exécutable à titre d'exemple. Vous pouvez replace les variables par vos noms de colonnes.

     declare @column1 varchar(10) = 'c1', @column2 varchar(10) = null, @column3 varchar(10) = 'c3', @column4 varchar(10) = 'c4', @column5 varchar(10) = null, @column6 varchar(10) = null, @columnN varchar(10) = null -- 'cN' declare @concatenated varchar(100) select @concatenated = rsortingm ( concat ( iif(@column1 is not null, concat(@column1, ' - '), ''), iif(@column2 is not null, concat(@column2, ' - '), ''), iif(@column3 is not null, concat(@column3, ' - '), ''), iif(@column4 is not null, concat(@column4, ' - '), ''), iif(@column5 is not null, concat(@column5, ' - '), ''), iif(@column6 is not null, concat(@column6, ' - '), ''), @columnN ) ) select rsortingm(left(@concatenated, len(@concatenated) - patindex('%[^-]%', reverse(@concatenated))+1)) as 'Result' 

    Cela renvoie le résultat en tant que c1 - c3 - c4

    Le premier select concatène les valeurs set.

    La seconde select supprime tous les espaces et tirets de fin provoqués par des champs nuls concaténés vers la fin.

    La logique peut gérer des scénarios comme toutes les valeurs null, les valeurs intermédiaires nulles, la dernière valeur null, durent toutes les valeurs nulles.