Какой самый короткий TSQL для объединения имени человека, который может содержать нули - PullRequest
4 голосов
/ 09 декабря 2008

3 поля: Имя, Отчество, Фамилия

Любое поле может быть пустым, но я не хочу лишних пробелов. Формат должен быть «Первый средний последний», «Первый последний», «Последний» и т. Д.

Ответы [ 10 ]

10 голосов
/ 09 декабря 2008
    LTRIM(RTRIM(
    LTRIM(RTRIM(ISNULL(FirstName, ''))) + ' ' + 
    LTRIM(RTRIM(ISNULL(MiddleName, ''))) + ' ' + 
    LTRIM(ISNULL(LastName, ''))
    ))

ПРИМЕЧАНИЕ. Это не оставляет следов или пробелов. Вот почему это немного страшнее, чем другие решения.

8 голосов
/ 09 декабря 2008

Предполагая, что под "дополнительными пробелами" вы подразумеваете дополнительные пробелы, вставленные во время объединения (я думаю, что это разумное предположение. Если у вас есть лишние пробелы в ваших данных, вы должны очистить их):

ISNULL(FirstName + ' ', '')  + ISNULL(MiddleName + ' ', '') + ISNULL(LastName, '')

работает, так как вы добавите к имени пробел - который, если он равен NULL, даст NULL - что приведет к пустой строке.

Редактировать: Если вы не учитываете ОПЦИЮ УСТАНОВКИ - это может быть опция соединения или дБ:

SET CONCAT_NULL_YIELDS_NULL OFF
LTRIM(FirstName + ' ' + NULLIF(MiddleName + ' ', ' ') + LastName)

немного короче, но немного страшнее.

Edit2: Поскольку вы приняли ответ UDF - IMO, это немного обманывает - вот некоторые в том же духе:

SELECT a FROM b

б - это вид. ;) Или же. сохраненный процесс,

EXEC c

Но, поскольку EXEC является необязательным:

c
4 голосов
/ 09 декабря 2008

используйте UDF:

`Select udfConcatName(First, Middle, Last) from foo`

Таким образом, вся ваша логика объединения имен находится в одном месте, и как только вы это написали, коротко позвонить.

3 голосов
/ 09 декабря 2008
LTRIM(RTRIM(ISNULL(FirstName, '') + ' ' + LTRIM(ISNULL(MiddleName, '') + ' ' + 
    ISNULL(LastName, ''))))
2 голосов
/ 09 декабря 2008

Почему бы не использовать вычисляемый столбец в таблице, которая выполняет конкатэт для вас, используя предпочитаемый вами синтаксис из множества, размещенных здесь? Затем вы просто запросите вычисляемый столбец - очень элегантно, и если вы сохраните вычисляемый столбец, вы можете даже получить небольшое увеличение производительности. Пример здесь

1 голос
/ 06 января 2012
replace(ltrim(rtrim(isnull(FirstName, '') + ' ' + isnull(MiddleName, '') + ' ' + isnull(LastName, ''))), '  ', ' ')
0 голосов
/ 22 августа 2015
Select firstname, middlename, lastname, ProvidedName = 

RTrim(Coalesce(FirstName + ' ','') 
+ Coalesce(MiddleName + ' ', '')
+ Coalesce(LastName + ' ', '')
+ COALESCE('' + ' ', '')
+ COALESCE(NULL, ''))

From names
0 голосов
/ 24 января 2014
DECLARE @first varchar(10) = 'First'
DECLARE @middle varchar(10) = ''
DECLARE @last varchar(10) = 'Last'

LTRIM(RTRIM(
    @first
    + ISNULL(NULLIF(' '+LTRIM(RTRIM(@middle)),' '),'')
    + ISNULL(NULLIF(' '+LTRIM(RTRIM(@last)),' '),'')
))

ПОЧЕМУ ЭТО РАБОТАЕТ

Поля уменьшаются до пустой строки, если NULL или пробел, с помощью функций LTRIM, RTRIM и ISNULL.

LTRIM(RTRIM(ISNULL(@middle,''))) -- Result is a trimmed non-null string value.

Это значение имеет префикс с одним пробелом, а затем сравнивается с одним пробелом с помощью функции NULLIF. Если равно, NULL результат. Если не равно, то используется значение.

NULLIF(' '+'',' ')       -- this would return NULL
NULLIF(' '+'Smith',' ')  -- this would return ' Smith'

Наконец, ISNULL () используется для преобразования NULL, переданного NULLIF, в пустую строку.

ISNULL(NULL,'')          -- this would return ''
ISNULL(' Smith','')      -- this would return ' Smith'
0 голосов
/ 09 декабря 2008
'"' + ltrim(rtrim(isnull(FirstName,''))) + ' ' + ltrim(rtrim(isnull(MiddleName,''))) + 
' ' + ltrim(rtrim(isnull(LastName,''))) + '","' + ltrim(rtrim(isnull(FirstName,''))) + 
' ' + ltrim(rtrim(isnull(LastName,''))) + '","' + ltrim(rtrim(isnull(LastName,''))) + 
'"'

ETC

0 голосов
/ 09 декабря 2008

LTrim(RTrim(Replace(IsNull(Firstname + ' ', '') + isNull(MiddleName, '') + IsNull(' ' + LastName, ''), ' ', ' ')))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...