【问题标题】:Remove Spaces in SQL Server table data删除 SQL Server 表数据中的空格
【发布时间】:2011-07-01 03:43:19
【问题描述】:

table1.column1 中有如下数据

A V John 
B V S Shultz
S Hanks
K L C Gove, P S Murphy

我们需要删除一个字母单词之间的空格。转换后的数据应该是这样的

AV John
BVS Shultz
S Hanks
KLC Gove, PS Murphy

是否可以编写sql查询正则表达式来清理一次整列数据。请指导。谢谢。

【问题讨论】:

  • 要在 SQL Server 中获得正则表达式功能,至少从 2008 R2 开始,您必须使用 SQLCLR。很遗憾。
  • @Jon 有一个链接给你 :) weblogs.sqlteam.com/jeffs/archive/2007/04/27/…
  • @Jon 这个事实在 Denali 中仍然是正确的——没有本地正则表达式。

标签: sql sql-server regex


【解决方案1】:

你可能想看看Using regular expression within a stored procedure

描述了如何在 SQL Server 客户端中使用正则表达式。

你也可以用 REPLACE 写一个函数

【讨论】:

    【解决方案2】:

    使用 T-SQL 是可能的,但没有人会说它很漂亮......

    with cNames as (
    select id=cast(id as tinyint), name=cast(name as varchar(50))
    from   (values (1, 'A V John'), (2, 'B V S Shultz'), 
           (3, 'S Hanks'), (4, 'K L C Gove, P S Murphy')
           ) n (id, name)
    ),
    cNumbers as (
    select n=row_number() over (order by (select 1))
    from (values (1),(1),(1),(1)) a (n)
    cross join (values (1),(1),(1),(1)) b (n)
    cross join (values (1),(1),(1),(1)) c (n)
    ),
    cNameparts as (
    select  c.id, n.n, c.name, 
            namepart=substring(c.name,n.n,charindex(' ',c.name+' ',n.n)-n.n)
    from    cNames c
    inner join cNumbers n
        on  substring(' '+c.name,n.n,1) = ' '
        and n.n < len(c.name)
    )
    select  name=
            (select case when len(namepart)>1 then ' ' else '' end +
                    namepart +
                    case when right(namepart,1)=',' then ' ' else '' end
            from    cNameparts np
            where   np.id = c.id
            for xml path(''))
    from    cNames c
    order by c.id;
    

    【讨论】:

    • 您好 Manfred 先生,感谢您的代码。我试过了,它大部分都在工作,在“Rao C S R”、“Lawrence D Souza”等案例中失败了。在第一种情况下,它更改为“RaoCS R”,在第二种情况下更改为“LawrenceD Souza”。应该是“Rao CSR”和“Lawrence D Souza”。您的代码有很多逻辑,不知道在哪里更改:) 请帮忙。
    • 我认为,该代码适用于单字母单词在前面的情况,但如果它们在中间或右端则失败。谢谢。
    • 例子前面只有字母,所以我只测试了这个case。逻辑是围绕最后一个子选择中的连接。您可以在其他情况下添加或省略空格,例如当 np.n=1 (“第一个词”)或当 np.n+len(namepart)>len(c.name) (“最后一个词”)时。
    【解决方案3】:

    我正在寻找类似问题的答案,这似乎解决了我遇到的问题

    Tom              Smith
    Tom                   Smith
    Tom                       Smith
    replace(replace(replace(NAME,' ','<>'),'><',''),'<>',' ')
    

    都将是基于this 链接的汤姆·史密斯

    【讨论】:

      【解决方案4】:

      这是匹配 2 个相邻单个字母之间的空格所需的正则表达式,然后将其替换为 ""(空白):

      "(?<(^| )[a-zA-Z]) (?=[a-zA-Z]( |$))"
      

      请注意,此模式不包括任何一个字母 - 它只是之间的空格。

      【讨论】:

      • 使用上面的正则表达式检查链接stackoverflow.com/questions/150977/…
      • 嗨波西米亚人,感谢您的帮助。我可以知道如何使用上面的来替换 2 个相邻的单个字母之间的空格。谢谢。
      猜你喜欢
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多