2012-12-14 159 views
25

我有一个表样品存储像下面转换逗号分隔列值的行

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

我所需要的输出数据等..

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

我怎么可以做同样的SQL Server中的选择查询?

+10

*** *** SQL只是*结构化查询语言* - 许多数据库系统中使用的语言,但没有AA数据库产品......很多事情都是特定于供应商 - 所以我们真的需要知道你正在使用的数据库系统**(以及哪个版本)...... –

+0

告诉我更多关于你的问题!你的桌子是什么?或者它的模式 –

+4

首先,你正在使用一个不好的数据模型。逗号分隔的字符串应该永远不会在数据库中。期。 – 2012-12-14 06:25:35

回答

45

试试这个

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); 

这里指

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

+0

谢谢..这应该有助于..正是我所期待的! – mhn

+1

谢谢!它帮助了我! – Gidil

+0

太棒了。节省了很多时间! – Shahdat

0

让我们尝试下面的脚本: -

declare @str varchar(max) 

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

select @str 
0

尝试与此有关。你会得到你的输出。

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

我不确定这是否回答了这个问题,但似乎并没有;该问题没有一个名为'EmployeeID'的字段,并将字符串值转换为XML似乎对我来说是巨大的矫枉过正... – DaveyDaveDave

+0

尽管此代码片段是受欢迎的,并且可能会提供一些帮助,但会[它包含了* how *它解决问题的解释](// meta.stackexchange.com/q/114762)。没有这些,你的答案就没有什么教育价值了 - 记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 –