TSQL 2008 Использование LTrim (RTrim и еще есть пробелы в данных - PullRequest
7 голосов
/ 30 июля 2010

У меня есть данные, которые я очищаю в старой таблице данных, прежде чем переместить ее в новую. В одном из полей есть пробелы в столбце справа и слева. Я написал следующий код для решения этой проблемы и до сих пор ведущие пробелы ?? Большая часть данных чиста при использовании этого кода, но по какой-то причине перед адресами 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 ]

11 голосов
/ 26 сентября 2012

У меня была такая же проблема - оборачивание строки в CAST (x как varbinary (64)) показывает гекс, и из этого я вижу A000 - который я считаю неразрывным пробелом.

Чтобы удалить, попробуйте это (для UNICODE);

LTRIM(RTRIM(REPLACE(my-column, NCHAR(0x00A0), '')))
6 голосов
/ 31 июля 2010

Вот выражение, которое будет работать. Я предполагаю, что нет невидимого контента. Вы все равно должны следовать рекомендации @OMG Ponies, если вы подозреваете это. И я думаю, что выражение PATINDEX можно добавить к этому выражению, если вам приходится иметь дело с невидимым содержимым.

SQL Server CASE обрабатывает только одно предложение WHEN, а затем разрывается. Таким образом, вы никогда не получите второе преобразование данных. Кроме того, все значения NULL будут преобразованы в NULL при использовании функций LTRIM и RTRIM. Таким образом, вам не нужно проверять это, если вы не хотите что-то делать с NULL.

Итак, попробуйте это:

CONVERT(VARCHAR(28), LTRIM(RTRIM(PropStreetAddr))) as [PROPERTY_STREET_ADDRESS]
6 голосов
/ 31 июля 2010

Использование:

WHEN PropStreetAddr is NOT NULL THEN
   (SELECT LTRIM(RTRIM((REPLACE(PropStreetAddr, 
                                SUBSTRING(PropStreetAddr, 
                                          PATINDEX('%[^a-zA-Z0-9 '''''']%', PropStreetAddr), 1), '') AS PropStreetAddr)
1 голос
/ 07 июня 2013

У меня похожая ситуация, изначально я думал, что функции LTRIM и RTRIM работают неправильно.Однако, как только я проверил это и увидел, что это не был правильный символ пробела (фактический символ может отличаться от вашего оскорбительного непечатаемого символа), используя:

ASCII

Я обнаружил, что символназвал 160, так что я сделал замену, как:

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

Надеюсь, это кому-нибудь поможет

...