Trim 额外的白色 space 列内

Trim extra white space within column

我有以下 select 将名称从 Lastname, Firstname 格式转换为 Firstname Lastname 格式。它似乎在名字和姓氏

之间添加了额外的白色 space
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

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

Johnnyyy Smithsonnn
Kimmey Test1
Denise Stuffing

尝试:

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

可能有名称有无,,后有无空格,或其他不一致。
无论如何,您可以在连接之前使用 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 

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

注意:外层的ltrim(rtrim( ... ))是可选的,我保留为"just in case"。

例子

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

Returns

NewValue
Johnnyyy Smithsonnn
Kimmey Test1
Denise Stuffing

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

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

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