如何从SQL Server字符串中删除空白字符

38

我正在尝试在SQL中从字符串中删除空格,但是 LTRIMRTRIM 函数似乎不起作用?

列:

[ProductAlternateKey] [nvarchar](25) COLLATE Latin1_General_CS_AS NULL

查询:

select REPLACE(ProductAlternateKey, ' ', '@'),
       LEN(ProductAlternateKey),
       LTRIM(RTRIM(ProductAlternateKey))      AS LRTrim,
       LEN(LTRIM(RTRIM(ProductAlternateKey))) AS LRLen,
       ASCII(RIGHT(ProductAlternateKey, 1))   AS ASCIIR,
       ASCII(LEFT(ProductAlternateKey, 1))    AS ASCIIL,
       ProductAlternateKey
from DimProducts
where ProductAlternateKey  like '46783815%'

结果:

|  COLUMN_0 | COLUMN_1 | LRTrim | LRLen | ASCIIR | ASCIIL | PRODUCTALTERNATEKEY |
---------------------------------------------------------------------------------
|  46783815 |        8 | 46783815|     8|   53   |   52   |            46783815 |
| 46783815  |        10|46783815  |   10|   10   |   52   |           46783815  |

如果 LTRIMRTRIM 不起作用,是否可以使用其他符号,比如“Enter”?

7个回答

84

使用 ASCII(RIGHT(ProductAlternateKey, 1)) 可以看到第二行最右边的字符是一个换行符或Ascii字符10。

不能 使用标准的 LTrimRTrim 函数移除。

然而,你可以使用 (REPLACE(ProductAlternateKey, CHAR(10), '')

你可能还想考虑回车和制表符。这三个(换行符、回车和制表符)通常是问题所在,可以用以下方法移除:

LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(ProductAlternateKey, CHAR(10), ''), CHAR(13), ''), CHAR(9), '')))

如果您遇到任何更多的“空格”字符,使用上述方法无法移除它们,请尝试以下一个或多个方法:

--NULL
Replace([YourString],CHAR(0),'');
--Horizontal Tab
Replace([YourString],CHAR(9),'');
--Line Feed
Replace([YourString],CHAR(10),'');
--Vertical Tab
Replace([YourString],CHAR(11),'');
--Form Feed
Replace([YourString],CHAR(12),'');
--Carriage Return
Replace([YourString],CHAR(13),'');
--Column Break
Replace([YourString],CHAR(14),'');
--Non-breaking space
Replace([YourString],CHAR(160),'');

可以使用这个潜在的空白字符列表来创建一个函数,例如:

Create Function [dbo].[CleanAndTrimString] 
(@MyString as varchar(Max))
Returns varchar(Max)
As
Begin
    --NULL
    Set @MyString = Replace(@MyString,CHAR(0),'');
    --Horizontal Tab
    Set @MyString = Replace(@MyString,CHAR(9),'');
    --Line Feed
    Set @MyString = Replace(@MyString,CHAR(10),'');
    --Vertical Tab
    Set @MyString = Replace(@MyString,CHAR(11),'');
    --Form Feed
    Set @MyString = Replace(@MyString,CHAR(12),'');
    --Carriage Return
    Set @MyString = Replace(@MyString,CHAR(13),'');
    --Column Break
    Set @MyString = Replace(@MyString,CHAR(14),'');
    --Non-breaking space
    Set @MyString = Replace(@MyString,CHAR(160),'');

    Set @MyString = LTRIM(RTRIM(@MyString));
    Return @MyString
End
Go

然后你可以按以下方式使用它:

Select 
    dbo.CleanAndTrimString(ProductAlternateKey) As ProductAlternateKey
from DimProducts

你的解决方案是有效的,因为返回46783815@@,这会一直有效吗?无论字符串中有多少个ASCII字符? - Justin
它考虑了通常的罪魁祸首,所以是的,你应该对此没问题。 - DMK
我有一个链接里的数据无法工作,请看一下: http://stackoverflow.com/questions/29100826/data-is-splitting-into-multiple-rows-while-copying-from-sql-server-2012-to-excel?noredirect=1#comment46439769_29100826 - rohit singh
回答晚了,但这太棒了。我在一列值的末尾有一堆空白小方块,结果发现是ASCII码8,也就是退格键?谁知道呢! - Mark Moretto

4
在这种情况下,前缀/后缀中并不包含空格。
第一行看起来没问题。对于第二行的内容,请执行以下操作。
ASCII(RIGHT(ProductAlternateKey, 1))

并且。
ASCII(LEFT(ProductAlternateKey, 1))

@shahkalpesh - 谢谢你分享这个,我之前不知道ASCII函数! - Dibstar

4

文本后可能会有2个空格,请确认。您也可以使用LTRIMRTRIM函数,对吧?

LTRIM(RTRIM(ProductAlternateKey))

也许额外的空格不是普通的空格(ASCII 32,软空格)?也许它们是“硬空格”,ASCII 160?
ltrim(rtrim(replace(ProductAlternateKey, char(160), char(32))))

0

这个怎么样?

CASE WHEN ProductAlternateKey is NOT NULL THEN
CONVERT(NVARCHAR(25), LTRIM(RTRIM(ProductAlternateKey))) 
FROM DimProducts
where ProductAlternateKey  like '46783815%'

0

看起来像是不可见字符 -

ALT+255

试试这个

select REPLACE(ProductAlternateKey, ' ', '@')
--type ALT+255 instead of space for the second expression in REPLACE 
from DimProducts
where ProductAlternateKey  like '46783815%'

Raj

编辑:根据ASCII()结果,尝试ALT+10 - 使用数字键盘


0
这是一个相当古老的帖子,但为了其他人的利益,默认情况下,TRIM只修剪标准空格,但您可以轻松地覆盖它。它非常易读(如果您不想删除字符串内的空白字符,则应使用该函数)。只需在TRIM中添加一个'FROM'子句,在'FROM'之前作为表达式列出可能存在的所有字符,例如...
TRIM(' $' + char(9) + char(10) + char(13) FROM ProductAlternateKey)

会从字符串中删除前导和尾随的空格、美元符号、制表符、回车和换行符。当然,你可以将这个表达式赋值给一个变量,并在代码中根据需要引用它,以使代码更易读和可维护...
TRIM(@whitespace FROM ProductAlternateKey)

-3

使用SQL删除列数据中的换行符

Update a set  a.CityName=Rtrim(Ltrim(REPLACE(REPLACE(a.CityName,CHAR(10),' '),CHAR(13),' ')))
,a.postalZone=Rtrim(Ltrim(REPLACE(REPLACE(a.postalZone,CHAR(10),' '),CHAR(13),' ')))  
From tAddress a 
inner Join  tEmployees p  on a.AddressId =p.addressId 
Where p.MigratedID is not null and p.AddressId is not null AND
(REPLACE(REPLACE(a.postalZone,CHAR(10),'Y'),CHAR(13),'X') Like 'Y%' OR REPLACE(REPLACE(a.CityName,CHAR(10),'Y'),CHAR(13),'X') Like 'Y%')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接