TSQL 2008 Использование LTrim (RTrim и все еще есть пробелы в данных

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

Ответ 1

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

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

Итак, попробуйте следующее:

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

ASCII

Я нашел персонажа с именем 160, поэтому я сделал замену вроде:

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

Надеюсь, что это поможет кому-то.