我会尽力解释我的问题。
我正在研究SSIS项目(商业智能)。在一个数据流中,我需要从括号中提取文本。
在基础数据库中,我有一个列(在表中),其中值彼此不同:
aaa(bbb ccc, ddd)
aaa(bbbb ccc, ddd)
aaa(bb)
等等。
我需要从括号中提取文本到不同列中的新数据库。
所以它看起来像这样
col1 col2 col3
bbb ccc ddd
是否有任何建议如何在数据流中完成此工作。正如你所看到的那样,基础数据库是一团糟,而我正试图让它更有条理。
答案 0 :(得分:1)
当您更改(
和时,您可以像这样分开:
<强> SQLFiddle 强>
;WITH to_xml(orig,col)
AS(
SELECT t, REPLACE(REPLACE(REPLACE(t, '(', ','), ' ', ','), ')', '')
FROM tab
)
,Split_Names (orig, col, xmlname)
AS
(
SELECT orig,
col,
CONVERT(XML,'<Vals><Val>'
+ REPLACE(col,',', '</Val><Val>') + '</Val></Vals>') AS xmlname
FROM to_xml
)
SELECT
orig,
xmlname.value('/Vals[1]/Val[1]','varchar(100)') AS col1,
xmlname.value('/Vals[1]/Val[2]','varchar(100)') AS col2,
xmlname.value('/Vals[1]/Val[3]','varchar(100)') AS col3,
xmlname.value('/Vals[1]/Val[4]','varchar(100)') AS col4
FROM Split_Names
答案 1 :(得分:1)
此解决方案会将您的琴弦分解到任何深度。首先,我将其拆分为前导部分和支架内的部件,之后我拆分内部部件。根据您的需求进行调整:
DECLARE @tbl TABLE(YourConcatColumn VARCHAR(1000));
INSERT INTO @tbl VALUES
('aaa(bbb ccc ddd)')
,('aaa(bbbb ccc ddd)')
,('aaa(bbb ddd)')
,('aaa(bb)');
WITH TwoParts(Inx, Divided) AS
(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Inx
,CAST('<root><r>' + REPLACE(REPLACE(tbl.YourConcatColumn,')',''),'(','</r><r>') + '</r></root>' AS XML)
FROM @tbl AS tbl
)
,InternalParts(Inx, LeadingPart,InternalParts) AS
(
SELECT TwoParts.Inx
,TwoParts.Divided.value('/root[1]/r[1]','varchar(max)')
,CAST('<root><r>' + REPLACE(TwoParts.Divided.value('/root[1]/r[2]','varchar(max)'),' ','</r><r>') + '</r></root>' AS XML)
FROM TwoParts
)
SELECT Inx
,ROW_NUMBER() OVER(PARTITION BY Inx ORDER BY (SELECT NULL)) AS InternalInx
,InternalParts.LeadingPart
,Parts.Part.value('.','varchar(max)')
FROM InternalParts
CROSS APPLY InternalParts.InternalParts.nodes('/root/r') AS Parts(Part)