SQL 2008使用LTrim(RTrim并且数据中仍然有空格

时间:2010-07-30 19:54:07

标签: sql-server formatting trim

我将数据清理到旧数据表中,然后再将其移动到新数据表中。其中一个字段在列中有空格,右边和右边。剩下。我写了下面的代码来解决这个问题,但仍然有领先的空间?使用此代码时,大部分数据都是干净的,但由于某种原因,在RT地址之前有空格......有其他人有这种类型的问题吗?

,CASE   
WHEN PropStreetAddr IS NOT NULL
 THEN  (CONVERT(VARCHAR(28),PropStreetAddr))  
WHEN PropStreetAddr is NOT NULL Then  (Select LTrim(RTrim(PropStreetAddr)) As PropStreetAddr)
     ELSE NULL END  as 'PROPERTY_STREET_ADDRESS'

示例输出数据:

1234 20th St 
  RT 1 BOX 2  
560 King St  
610 Nowland Rd  
  RT 1  
1085 YouAreHere Ln  
  RT 24 Box 12  

4 个答案:

答案 0 :(得分:11)

我遇到了同样的问题 - 在CAST中包装字符串(x作为varbinary(64))显示了十六进制,从中我看到A000 - 我相信它是不间断的空间。

要删除,请尝试此操作(对于UNICODE);

LTRIM(RTRIM(REPLACE(my-column, NCHAR(0x00A0), '')))

答案 1 :(得分:6)

使用:

WHEN PropStreetAddr is NOT NULL THEN
   (SELECT LTRIM(RTRIM((REPLACE(PropStreetAddr, 
                                SUBSTRING(PropStreetAddr, 
                                          PATINDEX('%[^a-zA-Z0-9 '''''']%', PropStreetAddr), 1), '') AS PropStreetAddr)

答案 2 :(得分:6)

这是可行的表达方式。我假设没有不可见的内容。如果你怀疑它,你仍然应该追求@OMG Ponies的推荐。我认为如果必须处理不可见的内容,可以将PATINDEX表达式添加到此表达式中。

SQL Server CASE只处理一个WHEN子句然后中断。所以你永远不会进行第二次数据转换。此外,使用LTRIM和RTRIM函数时,所有NULL值都将转换为NULL。所以,你不需要测试它,除非你想用NULL做一些事情。

所以,试试这个:

CONVERT(VARCHAR(28), LTRIM(RTRIM(PropStreetAddr))) as [PROPERTY_STREET_ADDRESS]

答案 3 :(得分:1)

我有类似的情况,最初我认为LTRIM& RTRIM功能无法正常工作。但是,一旦我测试了它并且可以看到它不是一个合适的空格字符(实际字符可能与您的违规不可打印字符不同),使用:

ASCII

我发现这个角色被命名为160,所以我做了一个替换,如:

SELECT REPLACE('NaughtyString', CHAR(160),'') 

希望它有助于某人