SQL从括号中获取文本

时间:2015-09-09 07:27:35

标签: sql-server ssis

我会尽力解释我的问题。

我正在研究SSIS项目(商业智能)。在一个数据流中,我需要从括号中提取文本。

在基础数据库中,我有一个列(在表中),其中值彼此不同:

aaa(bbb ccc, ddd)
aaa(bbbb ccc, ddd)
aaa(bb)

等等。

我需要从括号中提取文本到不同列中的新数据库。

所以它看起来像这样

col1  col2  col3
bbb   ccc   ddd

是否有任何建议如何在数据流中完成此工作。正如你所看到的那样,基础数据库是一团糟,而我正试图让它更有条理。

2 个答案:

答案 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)