35

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

柱子:

[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  |

LTRIM如果并且RTRIM不起作用,它可以是其他符号吗,例如“Enter”?

4

6 回答 6

81

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

不能使用标准LTrim RTrim函数删除。

但是,您可以使用(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
于 2013-01-08T09:34:41.760 回答
4

在这种情况下,前缀/后缀中的不是空格。
第一行看起来不错。对第 2 行的内容执行以下操作。

ASCII(RIGHT(ProductAlternateKey, 1))

ASCII(LEFT(ProductAlternateKey, 1))
于 2013-01-08T09:00:13.677 回答
3

正文后可能有2个空格,请确认。你可以使用LTRIMRTRIM功能也对吗?

LTRIM(RTRIM(ProductAlternateKey))

也许额外的空间不是普通空间(ASCII 32,软空间)?也许它们是“硬空间”,ASCII 160?

ltrim(rtrim(replace(ProductAlternateKey, char(160), char(32))))
于 2013-01-08T09:00:24.480 回答
0

看起来像隐形字符-

ALT+255

尝试这个

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

拉吉

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

于 2013-01-08T09:29:48.953 回答
0

这个怎么样?

CASE WHEN ProductAlternateKey is NOT NULL THEN
CONVERT(NVARCHAR(25), LTRIM(RTRIM(ProductAlternateKey))) 
FROM DimProducts
where ProductAlternateKey  like '46783815%'
于 2013-01-08T09:22:08.733 回答
-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%')
于 2015-09-23T15:49:22.437 回答