2012-12-14 2 views
25

J'ai une table Exemple avec les données stockées comme ci-dessousConvertir valeur de colonne séparées par des virgules aux lignes

Id | String 
-------------- 
1  abc,def,ghi 
2  jkl,mno,pqr 

J'ai besoin de la sortie comme ..

Id | processedrows 
-------------- 
1  abc 
1  def 
1  ghi 
2  jkl 
2  mno 
2  pqr 

Comment puis-je faire la même chose avec une requête de sélection dans SQL Server?

+10

*** SQL *** est juste le * Structured Query Language * - une langue utilisée par de nombreux systèmes de base de données, mais pas aa produit de base de données ... beaucoup de choses sont spécifiques au fournisseur - donc nous vraiment besoin de savoir quel ** système de base de données ** (et quelle version) vous utilisez .... –

+0

m'en dire plus au sujet de votre problème! quelle est ta table? ou c'est un schéma –

+4

Tout d'abord, vous utilisez un mauvais modèle de données. Les chaînes délimitées par des virgules ne doivent jamais figurer dans des bases de données. Période. –

Répondre

45

essayer cette

SELECT A.[id], 
    Split.a.value('.', 'VARCHAR(100)') AS String 
FROM (SELECT [id], 
     CAST ('<M>' + REPLACE([string], ',', '</M><M>') + '</M>' AS XML) AS String 
    FROM TableA) AS A CROSS APPLY String.nodes ('/M') AS Split(a); 

se référer ici

http://www.sqljason.com/2010/05/converting-single-comma-separated-row.html

+0

merci .. cela devrait aider .. exactement ce que je cherchais! – mhn

+1

Merci! Ça m'a aidé! – Gidil

+0

Génial. Beaucoup de temps sauvé! – Shahdat

0

Essayons le script ci-dessous: -

declare @str varchar(max) 

SELECT @str = isnull(@str +',', '') + a.Value 
FROM (SELECT Value Entityvalue from Table) a 

select @str 
0

Essayez avec cela. Vous obtiendrez votre sortie.

SELECT id, 
PARSENAME(REPLACE(Split.a.value('.', 'VARCHAR(100)'),'-','.'),1) 'Values' 
FROM 
(
    SELECT algorithms, 
    CAST ('<M>' + REPLACE(string, ',', '</M><M>') + '</M>' AS XML) AS Data 
    FROM <TableName> 
) AS A 
CROSS APPLY Data.nodes ('/M') AS Split(a) 
0
SELECT EmployeeID, 
LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS Certs 
FROM 
(
SELECT EmployeeID,CAST('<XMLRoot><RowData>' + REPLACE(Certs,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x 
FROM @t 
)t 
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n) 
+0

I Je ne suis pas sûr si cela répond à la question, mais il ne semble pas; la question n'a pas de champ appelé 'EmployeeID', et transformer les valeurs de chaîne en XML me semble être une surcharge énorme ... – DaveyDaveDave

+0

Alors que cet extrait de code est le bienvenu, et peut fournir de l'aide, il serait [grandement amélioré si il comprenait une explication] (// meta.stackexchange.com/q/114762) de * comment * il aborde la question. Sans cela, votre réponse a beaucoup moins de valeur éducative - rappelez-vous que vous répondez à la question pour les lecteurs dans le futur, pas seulement pour la personne qui demande maintenant! S'il vous plaît [modifier] votre réponse pour ajouter une explication, et donner une indication des limites et des hypothèses qui s'appliquent. –

Questions connexes