我将数据清理到旧数据表中,然后再将其移动到新数据表中。其中一个字段在列中有空格,右边和右边。剩下。我写了下面的代码来解决这个问题,但仍然有领先的空间?使用此代码时,大部分数据都是干净的,但由于某种原因,在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
答案 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),'')
希望它有助于某人