2010-11-11 5 views
4

Avoir 5 colonnes de données d'adresse. J'ai besoin de concaténer ces champs en une seule adresse avec des espaces entre les valeurs si elles existent. Si la colonne a une valeur nulle je devrais l'ignorer et ne pas entrer d'espace.T Concaténation de chaînes conditionnelles SQL

select 
     case 
      when street_number != '' THEN (cast(street_number as int)) 
     end as street_number, 
     case 
      when street_ext != '' then 
        case 
         when street_ext = 50 then '1/2' 
        end 
     end as street_ext, 
     case 
      when street_direct ! = '' then street_direct 
     end as street_direct, 
     case 
      when site_street ! = '' then site_street 
     end as site_street, 
     case 
      when site_address ! = '' then site_address 
     end as site_address 
    from parcel 

ce que je voudrais faire est d'avoir une variable et l'affecter à la valeur de la première colonne street_number, puis quand je passe à la colonne suivante, street_ext, si elle est non nulle je d aimer vérifier si la variable est nulle et si ce n'est pas le cas, ajouter un espace et la valeur ... et ainsi de suite. Je suis rouillé comme un diable et je pourrais utiliser une poussée dans la bonne direction.

Merci à tous.

+0

Merci à tous pour les réponses rapides, les gars Roche. – jim

Répondre

23

Utilisez le « + » pour concaténer des chaînes dans TSQL:

SELECT CASE 
     WHEN LEN(p.street_number) > 0 THEN p.street_number + ' ' 
     ELSE '' 
     END + 
     CASE 
     WHEN p.street_ext = 50 THEN '1/2' 
     WHEN LEN(p.street_ext) > 0 THEN '' 
     ELSE p.street_ext 
     END + ' ' + 
     CASE 
     WHEN LEN(p.street_direct) > 0 THEN p.street_direct + ' ' 
     ELSE '' 
     END + 
     CASE 
     WHEN LEN(p.site_street) > 0 THEN p.site_street + ' ' 
     ELSE '' 
     END + 
     CASE 
     WHEN LEN(p.site_address) > 0 THEN p.site_address + ' ' 
     ELSE '' 
     END AS full_address 
FROM PARCEL p 

Les LEN function renvoie zéro si la valeur de chaîne est NULL, ou une chaîne de longueur zéro.

+0

merci ... cela avec seulement quelques modifications a parfaitement fonctionné. – jim

3

J'ai supposé que vos types de données sont tous varchar ou similaires pour plus de simplicité. Si vous êtes OK avec la suppression des doubles espaces, que diriez-vous:

rtrim(ltrim(replace(isnull(street_number) + ' ' 
    + isnull(street_ext) + ' ' 
    + isnull(street_direct) + ' ' 
    + isnull(site_street) + ' ' 
    + isnull(site_address), ' ', ' '))) 
5

Les isnulls imbriqués peuvent faire ce dont vous avez besoin. Quelque chose comme:

SELECT 
    ISNULL(streetnumber + ' ', '') 
     + ISNULL(streetext + ' ', '') 
     etc 

en se basant sur le fait que NULL + '' = NULL.

4

Quelque chose le long des lignes de:

select coalesce(street_number+' ','')+ 
     coalesce(case when street_ext=50 then '1/2' else null end+' ','')+ 
     coalesce(street_direct+' ','')+ 
     coalesce(site_street+' ','')+ 
     coalesce(site_address,'') 
from parcel 
+0

Cela ne fonctionnera pas. COALESCE (street_number + '', '') retournera toujours l'option street_number + '' car elle ne sera jamais nulle en raison de l'espace concaténé à la fin. – AlphaKilo

0

D'abord, je déclare la seperator comme une variable, parce que les clients sont bien connus pour changer ceux-ci.

je ferais cela comme suit:

DECLARE @AddressSeperator NVARCHAR(5) = ' ' 

... puis pour la declation colonne, j'utiliser les éléments suivants:

, CONCAT 
(
    (CASE WHEN LEN(p.street_number) > 0 THEN p.street_number + @AddressSeperator ELSE '' END) 
    , (CASE WHEN p.street_ext = 50 THEN '1/2' + @AddressSeperator WHEN LEN(p.street_ext) > 0 THEN p.street_ext + @AddressSeperator ELSE '' END) 
    , (CASE WHEN LEN(p.street_direct) > 0 THEN p.street_direct + @AddressSeperator ELSE '' END) 
    , (CASE WHEN LEN(p.site_street) > 0 THEN p.site_street + @AddressSeperator ELSE '' END) 
    , ISNULL(p.site_address, '') 

) AS [full_address]