ltrim (rtrim (x)) оставить пробелы в содержании rtl - кто-нибудь знает, как это обойти? - PullRequest
0 голосов
/ 27 июля 2010

у меня есть таблица [Company] со столбцом [Address3], определенным как varchar (50) я не могу контролировать значения, введенные в эту таблицу, - но мне нужно извлечь значения без начальных и конечных пробелов. я выполняю следующий запрос:

SELECT DISTINCT RTRIM(LTRIM([Address3])) Address3 FROM [Company] ORDER BY Address3

столбец содержит значения rtl и ltr Большая часть извлеченных данных извлекается правильно, но НЕКОТОРЫЕ (не все) значения RTL возвращаются с начальными и / или конечными пробелами

Я попытался выполнить следующий запрос:

SELECT DISTINCT ltrim(rTRIM(ltrim(rTRIM([Address3])))) c, ltrim(rTRIM([Address3])) b, [Address3] a, rtrim(LTRIM([Address3])) Address3 FROM [Company] ORDER BY Address3

но он вернул одну и ту же проблему во всех столбцах - кто-нибудь знает, что может вызвать это?

Ответы [ 2 ]

1 голос
/ 27 июля 2010

Строки, которые возвращаются с посторонними пробелами, могут иметь вид пробела или невидимого символа, о котором функции обрезки не знают. В документации даже не упоминается то, что считается "пустым" (чертовски небрежно, если вы спросите меня). Попробуйте взять один из этих рядов и посмотреть на символы одного за другим, чтобы увидеть, что они за символы.

0 голосов
/ 27 июля 2010

, так как вы используете varchar, просто сделайте это, чтобы получить код ascii для всех плохих символов

--identify the bad character
SELECT 
    COUNT(*) AS CountOf
        ,'>'+RIGHT(LTRIM(RTRIM(Address3)),1)+'<' AS LastChar_Display
        ,ASCII(RIGHT(LTRIM(RTRIM(Address3)),1))  AS LastChar_ASCII
    FROM Company 
    GROUP BY RIGHT(LTRIM(RTRIM(Address3)),1)
    ORDER BY 3 ASC

выполните одноразовое исправление данных, чтобы удалить поддельный символ, где xxxx - значение ASCIIкак указано в предыдущем, выберите:

--only one bad character found in previous query
UPDATE Company
    SET Address3=REPLACE(Address3,CHAR(xxxx),'')

--multiple different bad characters found by previous query
UPDATE Company
    SET Address3=REPLACE(REPLACE(Address3,CHAR(xxxx1),''),char(xxxx2),'')

, если в ваших данных есть поддельные символы, удаляйте их из данных, а не каждый раз, когда вы выбираете данные.вам нужно будет добавить эту логику ЗАМЕНА ко всем ВСТАВКАМ и ОБНОВЛЕНИЯМ в этом столбце, чтобы не допустить появления поддельных символов в новых данных.

Если вы не можете изменить данные, вы можете просто выбрать их таким образом:

SELECT
    LTRIM(RTRIM(REPLACE(Address3,CHAR(xxxx),'')))
    ,LTRIM(RTRIM(REPLACE(REPLACE(Address3,CHAR(xxxx1),''),char(xxxx2),'')))
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...