2016-09-08 3 views
0

Я пытаюсь выполнить поиск таблицы на основе конкатенации столбцови lastName. Оба они определены как NVARCHAR(50) NOT NULLLEN (firstName) + LEN (lastName) не равно LEN (firstName + lastName)

Иногда запрос не находит совпадения, поскольку в конкатенированном столбце добавляются дополнительные пробелы. Вот запрос:

SELECT firstName + lastName AS fullName, LEN(firstName) + LEN(lastName) AS realLength, LEN(firstName + lastName) AS concatLength FROM UsersTable 

А вот изображение с результатами:

Query results

Что такое сделка с этим? Как я могу избежать лишних пробелов? Если я делаю SELECT RTRIM(firstName) + RTRIM(lastName) ..., я получаю правильное полное имя без лишних пробелов, но использование RTRIM слишком дорого, потому что мой набор данных очень большой. Это привело бы меня к мысли, что проблема заключается в самих данных, за исключением того, что LEN(firstName) - это то же самое, что и LEN(RTRIM(firstName))

+1

Если хранилище не вызывает беспокойства, почему бы не сохранить значение, которое вы ищете, в качестве собственного вычисленного столбца? –

+1

Когда вы добавите 2 значения varchar вместе, вы получите правильные заполненные пробелы. Проблема не в вашем коде, это в ваших данных. Что бы ни было правильным дополнением, ваши проблемы с varchars являются проблемой. –

+1

Я просто попробовал ваш запрос на большом наборе данных и дал правильные ответы. Посмотрите на свой скриншот; в столбце 'fullName' отображается имя и пустые пробелы. Проблема заключается в ваших данных, а не в запросе. Уверен, что ваши столбцы имен (или были когда-то) 'VarChar', а не' NVarChar'. –

ответ

3

У вас есть пробелы в конце вашего FirstName. Это достаточно легко проверить, что следующие возвращает 4:

select len(N'abcd ') 

Это свойство varchar() типов данных и len(). Конечно, когда вы их объединяете, затем SQL Server решает распознать пробелы в конце.

Такое поведение описано в разделе "Примечания" в documentation:

Примечания

LEN исключает конечные пробелы. Если это проблема, рассмотрите возможность использования функции DATALENGTH (Transact-SQL), которая не обрезает строку. Если обрабатывает строку юникода, DATALENGTH будет возвращать дважды число символов.

В комментарии предполагают, вы можете ltrim()/rtrim() значения до конкатенации их. Или используйте like.

+0

Это тот. Я не знал, что «LEN» исключает затерянные пространства, большое спасибо! – charmeleon

Смежные вопросы