2015-04-21 51 views
2

我有这么多的长数据库,所以我用逗号分开使用多个序列存储在单列中的seq_no,但现在我想要在单个列中的所有序列,所以我很困惑如何为此创建此sql结果。如何为此结果编写SQL查询?

例如:

 
TABLE STRUCTURE 
SR_NO IS INT , 
SEQ_NO IS VARCHAR(MAX) 
SR_NO SEQ_NO 
---------------------------------  
    1  1839073, 
    2  1850097,1850098, 
    3  1850099,1850100,1850110  

我需要得到这样的结果:

SEQ_NO 
-------------- 
1839073 
1850097 
1850098 
1850099 
1850100 
1850110 

谢谢!

+0

你想要Sr_No列吗? – captainsac

+0

如果你想要Sr_No列,你想保留该值还是重新编号? – jarlh

+0

不,我不想要。我只是单列 –

回答

5
declare @t table(Id int,seq varchar(100)) 
insert into @t (Id,seq) values (1,'1839073,'),(2,'1839073,1850098,'),(3,'1850099,1850100,1850110 ') 



;With Cte as (
SELECT A.Id, 
    Split.a.value('.', 'VARCHAR(100)') AS Seq 
FROM 
(
    SELECT Id, 
     CAST ('<M>' + REPLACE(seq, ',', '</M><M>') + '</M>' AS XML) AS Data 
    FROM @t 
) AS A CROSS APPLY Data.nodes ('/M') AS Split(a)) 

Select ID,Seq from Cte Where Seq > '' 
+0

感谢mohan我通过给出这个逻辑解决了我的问题。再次感谢。 –

1

我写了下面的查询参照Turning a Comma Separated string into individual rows

后,它会为你

create table STRUCTURE(SR_NO int, SEQ_NO varchar(max)) 
insert STRUCTURE select 1, '1839073,' 
insert STRUCTURE select 2, '1850097,1850098,' 
insert STRUCTURE select 3, '1850099,1850100,1850110' 


;with tmp(SR_NO, DataItem, SEQ_NO) as (
select SR_NO, LEFT(SEQ_NO, CHARINDEX(',',SEQ_NO+',')-1), 
STUFF(SEQ_NO, 1, CHARINDEX(',',SEQ_NO+','), '') 
from STRUCTURE 
union all 
select SR_NO, LEFT(SEQ_NO, CHARINDEX(',',SEQ_NO+',')-1), 
STUFF(SEQ_NO, 1, CHARINDEX(',',SEQ_NO+','), '') 
from tmp 
where SEQ_NO > '' 
) 

Select DataItem as SEQ_NO from tmp order by SEQ_NO; 
3

尝试分裂它的工作与XML

SELECT SR_NO, t.c.value('.', 'VARCHAR(2000)') COL1 
FROM (
    SELECT SR_NO, x = CAST('<t>' + 
     REPLACE(SEQ_NO, ',', '</t><t>') + '</t>' AS XML) 
     FROM 
     (values(1,'1839073'),(2, '1850097,1850098'), 
     (3, '1850099,1850100,1850110')) y(SR_NO, SEQ_NO) 

) a 
CROSS APPLY x.nodes('/t') t(c) 

结果:

SR_NO COL1 
1  1839073 
2  1850097 
2  1850098 
3  1850099 
3  1850100 
3  1850110 

你可以用你的表替换此:

(values (1,'1839073'),(2, '1850097,1850098'), 
    (3, '1850099,1850100,1850110')) y(SR_NO, SEQ_NO) 
2

这应做到:(与你的表名称替换YourTableName)

;WITH CTE(NEW_SEQ_NO, SEQ_NO) as (
SELECT LEFT(SEQ_NO, CHARINDEX(',',SEQ_NO + ',') -1), 
    STUFF(SEQ_NO, 1, CHARINDEX(',',SEQ_NO + ','), '') 
FROM YourTableName 
WHERE SEQ_NO <> '' AND SEQ_NO IS NOT NULL 
UNION all 
SELECT LEFT(SEQ_NO, CHARINDEX(',',SEQ_NO + ',') -1), 
    STUFF(SEQ_NO, 1, CHARINDEX(',',SEQ_NO + ','), '') 
FROM CTE 
WHERE SEQ_NO <> '' AND SEQ_NO IS NOT NULL 
) 

SELECT NEW_SEQ_NO from CTE ORDER BY NEW_SEQ_NO 

您可以检查该主题的更多信息: Turning a Comma Separated string into individual rows