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),'')
Надеюсь, что это поможет кому-то.