修剪列内的额外空白

Posted

技术标签:

【中文标题】修剪列内的额外空白【英文标题】:Trim extra white space within column 【发布时间】:2019-04-22 16:09:37 【问题描述】:

我有以下选择将名称从 Lastname, Firstname 格式转换为 Firstname Lastname 格式。它似乎在名字和姓氏之间添加了额外的空格

SELECT substring(D.NAME, charindex(',', replace(D.NAME, ' ', '')) + 1, len(D.NAME)) 
        + ' ' 
        + left(D.NAME, charindex(',', D.NAME) -1) AS First_Last
FROM TEST_TABLE D

以下是我现在得到的一些输出示例:

Johnnyyy            Smithsonnn
Kimmey       Test1
Denise          Stuffing

所需格式(名字和姓氏之间的一个空格):

Johnnyyy Smithsonnn
Kimmey Test1
Denise Stuffing

【问题讨论】:

。 .您应该展示您的示例数据的样子。这可能就是问题所在。 【参考方案1】:

我倾向于喜欢这种技术。在这个例子中,我们使用了一个罕见的替换模式†‡,但你可以使用<>><

注意:外部ltrim(rtrim( ... )) 是可选的,我将其保留为“以防万一”。

示例

Select NewValue = ltrim(rtrim(replace(replace(replace([Name],' ','†‡'),'‡†',''),'†‡',' ')))
 From  YourTable 

退货

NewValue
Johnnyyy Smithsonnn
Kimmey Test1
Denise Stuffing

【讨论】:

你好约翰,这是做什么的? '†‡' @DxTx 用 †‡ 替换任意数量的重复空格。这是扩张阶段。然后我们消除 ‡† 这将留下 †‡ 的 SINGLE 余数,然后将其替换为 SPACE 我也使用这种方法来规范化空格,不过如果您担心冲突,可以使用一对 guid 代替特殊字符。 @TimLehner 从来没有考虑过使用指导...对于绝对的防弹方法来说不是一个坏主意【参考方案2】:

可能有名称带有或不带有, 或在, 之后带有或不带有空格,或其他不一致。 无论如何,您可以在连接之前使用ltrim(rtrim())

select 
  case 
    when d.name like '%,%' then
      ltrim(rtrim(substring(d.name, charindex(',', name) + 1, len(d.name))))
      + ' ' +
      ltrim(rtrim(left(D.NAME, charindex(',', d.name) -1))) 
    when d.name like '% %' then  
      ltrim(rtrim(substring(d.name, charindex(' ', name) + 1, len(d.name))))
      + ' ' +
      ltrim(rtrim(left(D.NAME, charindex(' ', d.name) -1))) 
    else ltrim(rtrim(d.name))
 end AS First_Last 

【讨论】:

我收到一个错误,Invalid length parameter passed to the LEFT or SUBSTRING function. 这意味着并非所有名称都包含, 是的,没错,我看到一些名字没有逗号 仍然收到Invalid length parameter passed to the LEFT or SUBSTRING function 错误。我看到有些行是,,而不是空格,然后是名字,有些行是,,没有空格,姓氏。 有没有逗号没有空格的情况?【参考方案3】:

试试:

select ltrim(rtrim(left(D.NAME, charindex(',', D.NAME, 0) - 1)))
  + ' ' 
  + ltrim(rtrim(right(D.NAME, len(D.NAME) - charindex(',', D.NAME, 0))))
from TEST_TABLE D 

这适用于我在下面使用的一些测试数据:

insert into #Test ([Name]) values ('Johnnyyy, Smithsonnn')
insert into #Test ([Name]) values ('Kimmey, Test1')
insert into #Test ([Name]) values ('Denise, Stuffing')

这给出了预期的结果:

Johnnyyy Smithsonnn
Kimmey Test1
Denise Stuffing

【讨论】:

我收到一个错误Invalid length parameter passed to the LEFT or SUBSTRING function 您的代码是从您的问题中复制而来的吗?我所做的只是添加 ltrim(rtrim()) 来修剪字符串前后的空格。 是的,其余代码与我之前在原始帖子中的工作相同。 请检查我编辑的答案。我已经根据自己的数据对此进行了测试,并且可以正常工作。如果您收到无效长度错误,那么您必须有一些不带逗号的 NAME 值【参考方案4】:

我认为您打算在提取名称之后替换空格。所以:

SELECT (replace(left(D.NAME, charindex(',', D.NAME + ',') + 1), ' ', '') +
        ' ' +
        left(D.NAME, charindex(',', D.NAME + ',') - 1)
       ) AS First_Last
FROM TEST_TABLE D;

这也为charindex() 添加了一个逗号,因此逗号是可选的。

【讨论】:

错误:The replace function requires 3 argument(s). @JBinson88 。 . .谢谢。 似乎是先保留姓氏,后跟逗号,然后是名字的首字母,后跟姓氏(再次)。这是一个示例:Johnson,Amy 被格式化为 Johnson,A Johnson,而不是 Amy Johnson

以上是关于修剪列内的额外空白的主要内容,如果未能解决你的问题,请参考以下文章

表插入空白单元格

修剪 PySpark 中名称之间的额外空格

UIScrollview 底部的额外空白区域

javascript 修剪额外斜线的路径

更改 WKWebview 框架高度后如何删除 WKScrollView 内的空白区域?

修剪字符串中的额外字符(截断字符串)