2010-11-17 3 views
0

J'utilise SQL Server 2000 et je veux retourner une chaîne comme celle-ci de ce tableau:Comment puis-je générer un enregistrement en tant que chaîne avec les champs séparés par des virgules dans SQL?

Field1 | Field2 | Field3 

ABC | 123 | abc 
DEF | 456 | def 

sortie souhaitée:
"ABC, 123, abc"
« DEF, 456, def "

Je crois que je peux le faire par simple concaténation, mais il se sent mal. Quelle est la meilleure façon de procéder?

NOTE: Ceci est un exemple simple, l'utilisation réelle a plus de 9 champs et peut avoir des valeurs nulles.

+0

Je ne pense pas que la concaténation de chaînes est nécessairement fausse dans ce problème. Vous avez trois champs et il n'y a vraiment pas de raison d'utiliser autre chose que la concaténation de cordes. À moins que je manque quelque chose, on dirait que vous voulez utiliser un marteau pour tuer une mouche au lieu de la tapette à mouches –

+0

C'est en fait plus de 3 champs et pas ces données du tout. Ceci est un exemple simplifié. Ma table actuelle a 9 champs. Et je ne veux pas utiliser un marteau, juste le meilleur flyswatter (le plus efficace) disponible. – MAW74656

Répondre

1

essayer:

select 
    '"' 
     +ISNULL(CONVERT(varchar(1000),Field1),'null') 
     + ',' + ISNULL(CONVERT(varchar(1000),Field2),'null') 
     + ',' + ISNULL(CONVERT(varchar(1000),Field3),'null') 
     +'"' AS ResultColumn 
    from MyTable 

juste ajuster le 1000 dans chaque CONVERT(varchar(1000), nécessaire

+0

Le but de votre suggestion est d'utiliser ISNULL() pour rendre compte de Nulls, mais juste pour utiliser la concaténation? Je suis sûr que cela fonctionne, mais je suis également à la recherche de la meilleure méthode. – MAW74656

+0

vous souhaitez combiner des colonnes dans une seule valeur de chaîne? La concaténation est le moyen, tout comme l'addition combine des nombres. –

+0

Oui, son semblable, mais dans votre exemple d'addition, je pourrais utiliser SUM() au lieu de 1 + 2 + 3 ...... Où est quelque chose comme SUM() pour les chaînes? – MAW74656

1

Vous pouvez utiliser coalesce ou une concaténation simple comme vous l'avez mentionné.

Sélectionnez Champ1 + « « + Champ2 + », » + Field3

Prenez garde des valeurs nulles à travers, si Field1,2, ou 3 est nul, vous obtiendrez un résultat nul, ce comportement peut être changed mais n'est pas recommandé.

+0

Est-ce que quelqu'un a un bon exemple de comment utiliser Coelesce de la manière? Tous les exemples que j'ai vus sont pour 1 champ à travers plusieurs enregistrements. – MAW74656

0

La plus simple est la concaténation. Rappelez-vous, gardez-le simple pour la compréhension, la lisibilité et la maintenabilité. Pas besoin de code intelligent.

select (Field1 + ',' + Field2 + ',' + Field3) as result 
    from MyTable 

Voici un lien: http://msdn.microsoft.com/en-us/library/aa276862(SQL.80).aspx

Remarque

Lorsque vous concaténer des valeurs nulles, soit les concat rendements nuls de réglage nulle de sp_dboption ou SET CONCAT_NULL_YIELDS_NULL détermine le comportement lorsqu'une expression est NUL. Avec soit concat null renvoie null ou SET CONCAT_NULL_YIELDS_NULL activé ON, 'string' + NULL renvoie NULL. Si concat null renvoie null ou SET CONCAT_NULL_YIELDS_NULL est désactivé, le résultat est 'string'.

1

Hmm, pourquoi cherchez-vous une réponse plus complexe que concaténation? Si vous voulez quelque chose de "propre", alors faites la concaténation de votre code en appelant le serveur de base de données, de cette façon vous ne surchargez pas le serveur pour concaténer. Une chose que personne n'a mentionnée qui revient toujours à mordre les gens dans le cul est que si votre délimiteur (virgule) est contenu dans un champ de données, alors vous aurez des virgules supplémentaires et vos données seront ambiguës. (c'est-à-dire que "a, b, c, d" contient trois champs, ou quatre? Si le deuxième champ contient réellement "b, c" alors votre exportation est mal formée).

Le format CSV a été légèrement modifié au fil du temps, il n'existe donc pas de moyen standard pour gérer cette situation. La façon dont je préfère personnellement gérer cela est en enquêtant sur les valeurs du champ, puis en échappant aux citations en les répétant.Ainsi, par exemple, vous avez un enregistrement avec les données suivantes:

Champ1: abc

Champ2: def "1

Field3: 12", "3, b

L'enregistrement CSV être écrit:.

"abc","def""1","12,""""3,b" 

que le format évite toute ambiguïté possible dans les données sur le terrain

Le retour en arrière est simple et déterministe. L'autre option consiste à utiliser un délimiteur de champ qui, selon vous, ne peut jamais se produire dans les données de champ réelles. Ceci est un moyen rapide de le gérer, mais laisse une bombe à retardement dans votre programme pour qu'un autre programmeur le répare plus tard :-)

EDIT: Si vous n'allez pas lire les données, alors, bien sûr, vous devriez voir comment le programme qui lit les données gère l'importation de données contenant des caractères de délimitation dans le cadre des données de champ qui ne devraient pas être interprétées comme des délimiteurs de champs.

0

SELECT COALESCE (Champ1, '' '' '') + ',' + COALESCE (Champ2, '' '' '') + ',' + COALESCE (Champ3, '' '' '') FROM Table1

+0

Semble un gâchis si c'est le seul moyen d'utiliser coalesce dans cette situation. Pourquoi s'embêter? De cette façon, nous sommes vraiment en train de fusionner, puis de concaténer. Et à quel avantage? – MAW74656

Questions connexes