2014-12-22 50 views
0

我有一個表格,其中包含用戶列表,如下所示。SQL Server中的正則表達式

christopher.j.sansom 
vinay.prabhakar 
Guillaume.de.Miribel (Stage 2B); jean-marie.pierron (Stage 3B) 
ian.notley; pavan.sethi 
Ron.M.Barbeau 
jason.angelos 
jonathan.l.lange, ramesh.t.murti, 
nicole.f.cohen 

我們可以得到如下記錄。需要將逗號分隔的記錄作爲新行返回。

christopher.j.sansom 
vinay.prabhakar 
Guillaume.de.Miribel 
jean-marie.pierron 
ian.notle 
pavan.sethi 
Ron.M.Barbeau 
jason.angelos 
jonathan.l.lange 
ramesh.t.murti 
nicole.f.cohen 
+0

SQL Server本身不支持正則表達式,您是否有可用的正則表達式CLR?您需要一個** [Table-Valued User-Defined Function](http://technet.microsoft.com/en-us/library/ms191165(v = sql.105).aspx)**以刪除圓括號,將值分割並添加到1個單個結果集。 – funkwurm

回答

1

見正則表達式在這裏:https://regex101.com/r/hD2mQ8/1

您可以使用此模式:

/(^[\w.-]+)|(?<=; |,)[\w.-]+/與全球和多行修飾符來捕捉你所需要的文字,但我不知道你怎麼樣會在沒有看到您當前的代碼的情況下將每一個返回到新行。

1

要做到這一點,你需要一個字符串拆分器查詢/功能。
這是一個例子,還有其他方法可以做到這一點。

With Normalize AS (
    SELECT REPLACE(CONCAT(REPLACE(names, ',', ';'), ';'), ';;', ';') Names 
    FROM Table1 
), Splitter AS (
    Select names String 
     , WordCounter = 0 
     , NWordStart = 1 
     , NWordEnd = CHARINDEX(';', names) 
     , Word = CAST('' as nvarchar(255)) 
     , WordNumber = LEN(names) - LEN(REPLACE(names, ';', '')) + 1 
    FROM Normalize 
    UNION ALL 
    SELECT s.String 
     , WordCounter = s.WordCounter + 1 
     , NWordStart = s.NWordEnd + 1 
     , NWordEnd = COALESCE(NULLIF(CHARINDEX(';', s.String, NWordEnd + 1), 0) 
          , LEN(s.String) + 1) 
     , Word = LTRIM(Cast(SubString(String, s.NWordStart, s.NWordEnd - s.NWordStart) 
          AS nvarchar(255))) 
     , WordNumber = s.WordNumber 
    FROM Splitter s 
    WHERE s.WordCounter + 1 <= s.WordNumber 
) 
SELECT LEFT(WORD , CHARINDEX(' ', CONCAT(Word, ' ')) - 1) Word 
FROM Splitter 
WHERE Word <> ''; 

SQLFiddle Demo

CTE規格化改變所有的分離器的char ;具有用於分割的單個隔膜。
CTE拆分器使用;作爲分隔符將字符串拆分爲塊。
主查詢刪除搜索名稱和左括號之間空間的舞臺信息。