Объединить имя, отчество, фамилию и суффикс в T-SQL (без лишних пробелов) - PullRequest
10 голосов
/ 23 апреля 2010

Я пытаюсь не изобретать велосипед здесь ... У меня есть четыре поля:

[tbl_Contacts].[FirstName],
[tbl_Contacts].[MiddleInitial],
[tbl_Contacts].[LastName],
[tbl_Contacts].[Suffix] 

И я хочу создать FullName поле в представлении, но у меня не может быть лишних пробелов, если поля не заполнены ...

Так что я не могу сделать FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix... Потому что, если нет среднего начального значения или суффикса, у меня будет 2 лишних пробела в поле. Я думаю, что мне нужно заявление Case, но я думал, что у кого-то есть удобный метод для этого ... Кроме того, m iddleinitial и suffix могут быть нулевыми.

Ответы [ 9 ]

26 голосов
/ 23 апреля 2010

Предполагая, что все столбцы могут быть обнуляемыми, вы можете сделать что-то вроде:

RTrim(Coalesce(FirstName + ' ','') 
+ Coalesce(MiddleInitial + ' ', '')
+ Coalesce(LastName + ' ', '')
+ Coalesce(Suffix, ''))

Это зависит от того факта, что добавление к значению NULL приводит к получению NULL.

13 голосов
/ 23 апреля 2010

Какой бы вариант вы ни выбрали, здесь есть над чем подумать: этот вариант будет довольно сложным и, следовательно, отнимает много времени, особенно если он у вас есть в представлении, которое оценивается каждый раз для каждой рассматриваемой строки.

Если вам это нужно часто, я бы порекомендовал вам добавить это в вашу базовую таблицу как постоянное вычисляемое поле - что-то вроде:

ALTER TABLE dbo.tbl_Contacts
    ADD FullName AS  (insert the statement of your choice here) PERSISTED

Когда он сохраняется, он становится частью базовой таблицы, и он сохраняется и обновляется SQL Server. Когда вы запрашиваете его, вы возвращаете текущее значение без , что влечет за собой расходы на объединение полей и определение, какие использовать, а какие игнорировать ...

Просто о чем подумать - то, о чем слишком многие разработчики баз данных и баз данных склонны игнорировать и / или не знать ....

9 голосов
/ 23 апреля 2010

Возможно, вы захотите передать конкатенацию FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix через функцию REPLACE(), чтобы заменить повторяющиеся пробелы в один пробел.

REPLACE(FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix, '  ', ' ')
--                                                                        --    -

РЕДАКТИРОВАТЬ:

Только что заметил, что некоторые из ваших полей могут быть NULL, и поэтому вышеописанное не будет работать в этом случае, так как вся строка станет NULL.В этом случае вы можете использовать COALESCE() метод, предложенный Томасом , но все равно оберните его в REPLACE():

REPLACE(RTRIM(COALESCE(FirstName + ' ', '') +
              COALESCE(MiddleInitial + ' ', '') +
              COALESCE(LastName + ' ', '') +
              COALESCE(Suffix, '')), '  ', ' ')

Тест:

SELECT REPLACE(RTRIM(COALESCE('John' + ' ', '') +
                     COALESCE('' + ' ', '') +
                     COALESCE('Doe' + ' ', '') +
                     COALESCE(NULL, '')), '  ', ' ')

-- Returns: John Doe
1 голос
/ 31 мая 2016

Если вы используете SQL Server 2012+, вы можете использовать CONCAT и +:

SELECT RTRIM(
       CONCAT(FirstName + ' ', MiddleInitial + ' ', LastName + ' ', Suffix)
      ) AS [FullName]
FROM tbl_Contacts;

Как это работает:

  1. Если какая-либо часть полного имениNULL затем NULL + ' 'NULL
  2. CONCAT обрабатывает NULL
  3. В случае, если после части имени остается только NULLs, TRIM последний пробел.

LiveDemo

1 голос
/ 13 марта 2015

Я должен был присоединиться к имени, отчеству и фамилии. моя задача заключалась в том, чтобы обрабатывать значения NULL, используя следующий код.

RTRIM(LTRIM(RTRIM(isnull(@firstname,'') + ' ' + isnull(@middlename,'')) + ' ' + isnull(@lastname,'')))

Тестирование различных сценариев, если вы заинтересованы:)

DECLARE @firstname VARCHAR(MAX)
DECLARE @middlename VARCHAR(MAX)
DECLARE @lastname VARCHAR(MAX)

set @firstname = 'FirstName'
set @middlename = NULL
set @lastname = 'LastName'

SELECT '|'+RTRIM(LTRIM(RTRIM(isnull(@firstname,'') + ' ' + isnull(@middlename,'')) + ' ' + isnull(@lastname,'')))+'|'
--
0 голосов
/ 04 января 2019

запрос:

SELECT retire.employeehrmsid, 
       Isnull(retire.firstname, '') + ' ' 
       + Isnull(retire.middlename, '') + ' ' 
       + Isnull(retire.lastname, '') AS FullName, 
       retire.dojtoservice, 
       retire.designation, 
       emphistory.currentdoj, 
       emphistory.presentddo, 
       emphistory.office, 
       transfer.generatetid          AS TransferID, 
       transfer.transferdate, 
       transfer.currentlocation, 
       transfer.newlocation, 
       transfer.datas                AS Transfer_Doc, 
       release.generaterid           AS ReleaseID, 
       release.releasedate, 
       release.datar                 AS Release_Doc, 
       employeeserviceupdate.dataeu  AS Join_Doc 
FROM   retire 
       INNER JOIN emphistory 
               ON retire.id = emphistory.id 
       INNER JOIN employeeserviceupdate 
               ON retire.id = employeeserviceupdate.id 
       INNER JOIN transfer 
               ON retire.id = transfer.id 
                  AND emphistory.ehrid = transfer.ehrid 
       INNER JOIN release 
               ON transfer.tid = release.tid 
0 голосов
/ 10 февраля 2017

выберите имя CONCAT (IFNULL (FirstName, ''), '', IFNULL (MiddleName, ''), '', IFNULL (LastName, '')) из таблицы

0 голосов
/ 28 сентября 2014

создать функцию getfname (@n varchar (30)) возвращает varchar (30) как начать объявить @s varchar (30) set @ s = LEFT (@ n, charindex ('', @ n) -1) возврат @s конец

создать функцию getLname (@n varchar (30)) возвращает varchar (30) как начать объявить @s varchar (30)

set @ s = подстрока (@ n, charindex ('', @ n + 1), Len (@n))

возврат @s конец

0 голосов
/ 23 апреля 2010

Вот решение:

CREATE FUNCTION dbo.udf_IsNullOrEmpty
(
@vchCheckValue VARCHAR(MAX)
,@vchTrueValue VARCHAR(MAX)
,@vchFalseValue VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN

RETURN CASE WHEN NULLIF(RTRIM(LTRIM(@vchCheckValue)),'') IS NULL THEN @vchTrueValue ELSE @vchFalseValue END

END

SELECT FirstName + ' ' + 
       dbo.udf_IsNullOrEmpty(MiddleInitial,'',MiddleInitial + ' ') + 
       LastName + 
       dbo.udf_IsNullOrEmpty(Suffix,'',' ' + Suffix)
FROM tbl_Contacts
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...