7

在将旧数据表移动到新数据表之前,我在清理旧数据表中的数据。其中一个字段在右侧和左侧的列中有空格。我写了下面的代码来解决这个问题并且仍然有前导空格?使用此代码时,大部分数据是干净的,但由于某种原因,在 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

4 回答 4

11

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

要删除,试试这个(对于 UNICODE);

LTRIM(RTRIM(REPLACE(my-column, NCHAR(0x00A0), '')))
于 2012-09-26T11:29:56.153 回答
7

利用:

WHEN PropStreetAddr is NOT NULL THEN
   (SELECT LTRIM(RTRIM((REPLACE(PropStreetAddr, 
                                SUBSTRING(PropStreetAddr, 
                                          PATINDEX('%[^a-zA-Z0-9 '''''']%', PropStreetAddr), 1), '') AS PropStreetAddr)
于 2010-07-30T20:03:18.517 回答
6

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

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

所以,试试这个:

CONVERT(VARCHAR(28), LTRIM(RTRIM(PropStreetAddr))) as [PROPERTY_STREET_ADDRESS]
于 2010-07-30T21:19:52.253 回答
1

我有类似的情况,最初我认为 LTRIM 和 RTRIM 功能无法正常工作。但是,一旦我对其进行测试并且可以看到它不是正确的空白字符(实际字符可能与您的违规不可打印字符不同),请使用:

ASCII

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

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

希望它可以帮助某人

于 2013-06-07T14:51:07.007 回答