7
votes

Comment concaténer des chaînes et des virgules sur SQL Server?

Je suis relativement nouveau à MSSQL, alors désolé si la question sonne triviale. Je veux concaténer plusieurs champs avec un délimiteur , code>. Toutefois, lorsque le champ est vide, le supplémentaire, code> sera également inclus dans la chaîne de résultat. Alors, y a-t-il un moyen facile de résoudre ce problème? Par exemple,

SELECT VRI.Street_Number_and_Modifier + ',' + 
       VRI.Street_Direction + ',' + 
       VRI.Street_Name + ',' + 
       VRI.Street_Direction + ',' + 
       VRI.Street_Suffix + ',' + 
       VRI.Street_Post_Direction + ',' + 
       VRI.Unit
FROM View_Report_Information_Tables VRI


0 commentaires

13 Réponses :


2
votes

Essayez ceci:

SELECT  COALESCE(VRI.Street_Number_and_Modifier + ',','') + 
        COALESCE(VRI.Street_Direction + ',','') + 
        COALESCE(VRI.Street_Name + ',','') + 
        COALESCE(VRI.Street_Direction + ',','') + 
        COALESCE(VRI.Street_Suffix + ',','') + 
        COALESCE(VRI.Street_Post_Direction + ',','') + 
        COALESCE(VRI.Unit,'')
FROM View_Report_Information_Tables VRI


6 commentaires

@Lamak: Merci beaucoup, très propre et facile à comprendre. Mais les virgules sont toujours là :(. Toute idée?


@Chan: Que voulez-vous dire avec "les virgules en sont toujours là"?, Pouvez-vous montrer un exemple de l'entrée et de la sortie? La requête ci-dessus devrait fonctionner que lorsqu'un champ est null , vous ne devriez pas obtenir de virgules supplémentaires.


@Lamak: C'est le résultat que j'ai eu: , mae rose , dr ,


@Chan: Je crois que votre problème est que vous n'obtenez pas null lorsque le champ est vide, vous obtenez un ''.


@Lamak: Alors, comment puis-je gérer ce problème? Merci.


@Quandary: Je cours SQL Server 2008 R.



0
votes

Vous pouvez utiliser le isnull (champ + ',', '')


3 commentaires

Merci, cependant les virgules sont toujours là :(. Toute idée?


Ne sera jamais nul parce que vous avez ajouté une virgule à NULL.


@freegnu essayez ceci Sélectionnez Isnull (NULL + ',', ''). Null + 'une chaîne' renvoie null



2
votes

Réponse courte ou longue?

Réponse courte - ne pas. Ceci est un problème de formatage et non un problème de base de données. P>

réponse longue - lorsque vous concatéez une chaîne et une null dans SQL Server, le résultat est null. Vous pouvez donc utiliser des combinaisons d'ISNULL P>

SELECT ISNULL(afield + ',','') + ISNULL(bfield + ',','')


3 commentaires

Ne sera jamais nul parce que vous avez ajouté une virgule à NULL.


@freegnu - SQL Server à partir de 2008 appelle une null + une chaîne A NULL.


J'ai essayé ceci pour MSSQL 2008 et cela a fonctionné comme je le voulais. Je voulais concéder la nom de famille + prénom + initiale. Dans ce cas, je voulais insérer une virgule ', qu'après l'autre nom que s'il n'est pas nul. Merci pour l'info jamlec



0
votes
SELECT isnull(VRI.Street_Number_and_Modifier + ',','')+
   isnull(VRI.Street_Direction + ',','')+
   isnull(VRI.Street_Name + ',','')+
   isnull(VRI.Street_Direction + ',','')+
   isnull(VRI.Street_Suffix + ',','')+
   isnull(VRI.Street_Post_Direction + ',','')+
   isnull(VRI.Unit,'')
FROM View_Report_Information_Tables VRI

3 commentaires

Ne fonctionne pas, car la virgule doit également être supprimée lorsque String2 = null


Les champs peuvent aussi être des cordes. De plus, cela ne fonctionne que sur MS-SQL 2008 où String + Null = NULL, Contrairement à SQL 2005.


@Quandary String + Null = NULL sur SQL Server 2005 Si vous avez Ansi_nulls ON (dont il devrait être par défaut, même sur SQL Server 2005).



1
votes

Vous devez utiliser Select Case lorsque ISnull (Nom de terrain, '') = '' ou Ltrim (RTRIM (Nom de terrain)) = '') ALORS ... FIN + ...

Modifier:
A été écrit de Android Mobile.
En dessous de votre exemple.
Les traductions suivantes (de l'allemand) s'appliquent, FYI:

vorname: nom donné

Nom: Nom de famille
Benuzer: utilisateur

et voici l'exemple de code: xxx


2 commentaires

Pouvez-vous me donner un exemple? Merci.


@Chan: Exemple ajouté. @Cade Roux: Est-ce toujours vrai pour SQL 2008? Je me souviens avoir besoin de ça ... Eh bien Isnull (Nom, '') = '' devrait suffire alors, alors oubliez toutes les déclarations ou toutes les déclarations, mais seulement le ou, pas le et.



0
votes

Je serais complètement d'accord avec la courte réponse de Jamiec.

Sinon, je regarderais une solution méchante d'utiliser un remplacement ([Concat], ',', ',', ',') Partout où vous concatéez deux colonnes, puis trouvez comment couper les virgules du début et de la fin de la chaîne où les premières et dernières colonnes peuvent être vides. Très très désordonné.


0 commentaires

6
votes

Si les colonnes sont vides au lieu de NULL, vous pouvez essayer ceci:

SELECT VRI.Street_Number_and_Modifier 
    + CASE WHEN VRI.Street_Number_and_Modifier <> '' THEN ', ' ELSE '' END
       + VRI.Street_Direction
    + CASE WHEN VRI.Street_Direction <> '' THEN ', ' ELSE '' END
       + VRI.Street_Name
    + CASE WHEN VRI.Street_Name <> '' THEN ', ' ELSE '' END
       + VRI.Street_Direction
    + CASE WHEN VRI.Street_Direction <> '' THEN ', ' ELSE '' END
       + VRI.Street_Suffix
    + CASE WHEN VRI.Street_Suffix <> '' THEN ', ' ELSE '' END
       + VRI.Street_Post_Direction
    + CASE WHEN VRI.Street_Post_Direction <> '' THEN ', ' ELSE '' END
       + VRI.Unit
    + CASE WHEN VRI.Unit<> '' THEN ', ' ELSE '' END
FROM View_Report_Information_Tables VRI


4 commentaires

Merci, mais maintenant, j'ai eu une erreur de syntaxe: syntaxe incorrecte près '.' aucune idée?


@Chan - regarder dans ce que cela pourrait être. En outre, j'ai fait un tas d'autres erreurs que je vais réparer vraiment vite.


Maintenant, cela fonctionnait parfaitement. Merci pour une telle solution élégante;).


@Chan - Gardez simplement à l'esprit que cela ne fonctionne que si les champs sont des chaînes vides. Si leurs valeurs pouvaient être nuls, vous voudrez certainement rechercher cela avec certaines des autres solutions.



13
votes

Cette version modifiée de la poignée de Lamak NULL ou des cordes contenant uniquement de l'espace / vide: xxx


2 commentaires

Nice - je ne savais pas à Nullif. Merci!


Cet exemple ne fonctionne pas. La fonction de regroupement nécessite au moins 2 paramètres.



9
votes

J'ai pu l'amener à travailler avec une approche légèrement différente. Mettre les virgules au début de chaque champ, puis retirer le premier avec la fonction de substance travaillée pour moi: xxx


1 commentaires

Les crochets sont un peu sur la place, mais cela fonctionne bien!



0
votes

Je voulais voir si je peux l'obtenir sans utiliser de cas mais ne pouvait pas. Une façon de mine à long terme: xxx


0 commentaires

0
votes
SELECT  COALESCE(NULLIF(ad.UDEFPROPERTYADDRESS_ADDRSS_LN_1_TXT, ''), ',')+
    COALESCE(NULLIF(ad.UDEFPROPERTYADDRESS_ADDRSS_LN_2_TXT, '') , ',')+
    COALESCE(NULLIF(ad.UDEFPROPERTYADDRESS_ADDRSS_LN_3_TXT, '') , ',')+
    COALESCE(NULLIF(ad.UDEFPROPERTYADDRESS_CITY_TXT, '') , ',')+
    COALESCE(NULLIF(ad.UDEFPROPERTYADDRESS_ST_TXT, '') , ',')+
    COALESCE(NULLIF(ad.UDEFPROPERTYADDRESS_CNTRY_TXT, '') , ',')+
    COALESCE(NULLIF(ad.UDEFPROPERTYADDRESS_PSTL_CD, '') , '')
    FROM ACCOUNT_DETAILS ad

0 commentaires

-1
votes

Cela n'ajoutera pas de virgules si NULL-Strings

SELECT CONCAT_WS(', ', IFNULL(column1, NULL), 
         IFNULL(column2, NULL), IFNULL(column3, NULL), 
         IFNULL(column4, NULL), IFNULL(column5, NULL))
FROM yourtable


1 commentaires

Downvote, SQLServer n'a pas la fonction CONCAT_WS. C'est une fonction mysql.



3
votes

pour SQL 2008 + strong>

Utilisation Isnull (colmn1 + ',', '') Entraînera toujours une virgule de premier plan à la fin, vous devrez donc le gérer. Exemple: p> xxx pré>

ou nous pourrions aborder cela l'autre solution et utiliser la fonction de substance pour supprimer notre virgule de départ qui a l'air plus propre, exemple: P>

SELECT CONCAT_WS(',' --delimiter
            ,'1 Microsoft Way', NULL, NULL, 'Redmond', 'WA', 98052) AS Address;


0 commentaires