2017-02-13 65 views
1

我不確定這是否可以在SQL Server中完成。可能有人請幫助我,如果可能與SQL?SQL Server中的關鍵正則表達式實現

我有一個數據表看起來像這樣:

DECLARE @MYTABLE TABLE 
(
    ColumnA VARCHAR (50) 
) 

INSERT INTO @MYTABLE 
    SELECT '01268 591558 * 3 Marina' UNION ALL 
    SELECT '01322 421980    JULIE  A/P' UNION ALL 
    SELECT '01296620096 BR TAKES CARD EOM' UNION ALL 
    SELECT '07547 740863/07986 019852' UNION ALL 
    SELECT '07754553528 - TIM' UNION ALL 
    SELECT '07732418595 sam' UNION ALL 
    SELECT '01793 425574- Charlotte' UNION ALL 
    SELECT '01268 591558 * 3 Marina' UNION ALL 
    SELECT '07967 967404 CELIA' UNION ALL 
    SELECT '0208 361 1213/1433      /8899 ' UNION ALL    
    SELECT '0208 361 1213/1433 '  UNION ALL         
    SELECT '0208 361 1213/1433' UNION ALL          
    SELECT '01206 578671/564272' UNION ALL 
    SELECT '01206735561/07748116152' UNION ALL 
    SELECT '0208 361 1213/1433  '  UNION ALL        
    SELECT '   SUE' UNION ALL 
    SELECT '01206735561/07748116152/0156589' 

,我期待像

輸出

enter image description here

五月有人請幫助我?

謝謝

+0

清理你的電話號碼是硬任務,是不是非常適合SQL。即使使用正則表達式匹配,這也很難。 –

+0

要添加到Gordon所說的內容,SQL不支持正則表達式。對_limited_模式匹配有一些支持,但SQL不適合您要完成的任務。 – pymaxion

+0

:)我的壞....... –

回答

1

適用於樣本數據,但有一些潛在的隱患。

目前XML將分成9個職位(易於擴展或合同)。

很明顯,如果需要,您可以添加更多的ColumnX。只要按照模式

Select A.* 
     ,Column1 = left(Pos1,11) 
     ,Column2 = case when Try_Convert(float,Pos2) is null then null else Left(Pos1,11-Len(Pos2))+Pos2 end 
     ,Column3 = case when Try_Convert(float,Pos3) is null then null else Left(Pos1,11-Len(Pos3))+Pos3 end 
From @MYTABLE A 
Cross Apply (
       Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)'))) 
         ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)'))) 
         ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)'))) 
         ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)'))) 
         ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)'))) 
         ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)'))) 
         ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)'))) 
         ,Pos8 = ltrim(rtrim(xDim.value('/x[8]','varchar(max)'))) 
         ,Pos9 = ltrim(rtrim(xDim.value('/x[9]','varchar(max)'))) 
       From (Select Cast('<x>' + replace((Select replace(replace(A.ColumnA,' ',''),'/','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as C 
      ) B 

返回

enter image description here

+0

無語......感謝很多約翰:) –

+0

@RohiniMathur快樂它幫助 –

+0

嗨約翰,建議的解決方案工作真棒,是否有可能繞過這個錯誤,我得到的時候對生產數據庫進行測試。 「傳遞給LEFT或SUBSTRING函數的長度參數無效。」請幫助 –