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