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()
添加一个逗号,因此逗号是可选的。
我有以下 select 将名称从 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
所需格式(名字和姓氏之间的单个 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()
添加一个逗号,因此逗号是可选的。