2017-02-13 67 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函数的长度参数无效。”请帮助 –