Подстрока T-SQL – разделение имени и фамилии

У меня есть столбец с именами FirstName и LastName. Я пишу отчет для разделения FirstName и LastName. Как я могу получить имя FirstName и LastName в T-SQL?

Предполагая, что FirstName имеет все символы до первого пространства:

 SELECT SUBSTRING(username, 1, CHARINDEX(' ', username) - 1) AS FirstName, SUBSTRING(username, CHARINDEX(' ', username) + 1, 8000) AS LastName FROM whereever 

Самый простой способ, который я могу найти, это:

 SELECT SUBSTRING(FullName, 1, CHARINDEX(' ', FullName) - 1) AS FirstName, REVERSE(SUBSTRING(REVERSE(FullName), 1, CHARINDEX(' ', REVERSE(FullName)) - 1)) AS LastName FROM [PERSON_TABLE] 

Это должно работать:

 Select LTRIM(RTRIM(SUBSTRING(FullName, 0, CHARINDEX(' ', FullName)))) As FirstName , LTRIM(RTRIM(SUBSTRING(FullName, CHARINDEX(' ', FullName)+1, 8000)))As LastName FROM TABLE 

Изменить : Принял намек Аарона и Джонни с фиксированной длиной 8000, чтобы избежать ненужных вычислений.

 validate last name is blank SELECT person.fullName, (CASE WHEN 0 = CHARINDEX(' ', person.fullName) then person.fullName ELSE SUBSTRING(person.fullName, 1, CHARINDEX(' ', person.fullName)) end) as first_name, (CASE WHEN 0 = CHARINDEX(' ', person.fullName) THEN '' ELSE SUBSTRING(person.fullName,CHARINDEX(' ', person.fullName), LEN(person.fullName) )end) last_name FROM person 

Это позаботится о таких именах, как «Firstname Z. Lastname» и «First Z Last»

 SELECT CASE WHEN CHARINDEX(' ',name) = 0 THEN name WHEN CHARINDEX(' ',name) = PATINDEX('% _[., ]%',name) THEN RTRIM(SUBSTRING(name, 1, CHARINDEX(' ',name) + 2)) ELSE SUBSTRING(name,1, CHARINDEX(' ',name)) END [firstname] ,CASE WHEN CHARINDEX(' ',name) = 0 THEN '' WHEN CHARINDEX(' ',name) = PATINDEX('% _[., ]%',name) THEN LTRIM(SUBSTRING(name, CHARINDEX(' ',name) + 3,1000)) ELSE SUBSTRING(name,CHARINDEX(' ',name)+1,1000) END [lastname] FROM [myTable] 

Вот более продуманное решение с функцией SQL:

GetFirstname

 CREATE FUNCTION [dbo].[ufn_GetFirstName] ( @FullName varchar(500) ) RETURNS varchar(500) AS BEGIN -- Declare the return variable here DECLARE @RetName varchar(500) SET @FullName = replace( replace( replace( replace( @FullName, '.', '' ), 'Mrs', '' ), 'Ms', '' ), 'Mr', '' ) SELECT @RetName = CASE WHEN charindex( ' ', ltrim( rtrim( @FullName ) ) ) > 0 THEN left( ltrim( rtrim( @FullName ) ), charindex( ' ', ltrim( rtrim( @FullName ) ) ) - 1 ) ELSE '' END RETURN @RetName END 

GetLastName

 CREATE FUNCTION [dbo].[ufn_GetLastName] ( @FullName varchar(500) ) RETURNS varchar(500) AS BEGIN DECLARE @RetName varchar(500) IF(right(ltrim(rtrim(@FullName)), 2) <> ' I') BEGIN set @RetName = left( CASE WHEN charindex( ' ', reverse( ltrim( rtrim( replace( replace( replace( replace( replace( replace( @FullName, ' Jr', '' ), ' III', '' ), ' II', '' ), ' Jr.', '' ), ' Sr', ''), 'Sr.', '') ) ) ) ) > 0 THEN right( ltrim( rtrim( replace( replace( replace( replace( replace( replace( @FullName, ' Jr', '' ), ' III', '' ), ' II', '' ), ' Jr.', '' ), ' Sr', ''), 'Sr.', '') ) ) , charindex( ' ', reverse( ltrim( rtrim( replace( replace( replace( replace( replace( replace( @FullName, ' Jr', '' ), ' III', '' ), ' II', '' ), ' Jr.', '' ), ' Sr', ''), 'Sr.', '') ) ) ) ) - 1 ) ELSE '' END , 25 ) END ELSE BEGIN SET @RetName = left( CASE WHEN charindex( ' ', reverse( ltrim( rtrim( replace( replace( replace( replace( replace( replace( replace( @FullName, ' Jr', '' ), ' III', '' ), ' II', '' ), ' I', '' ), ' Jr.', '' ), ' Sr', ''), 'Sr.', '') ) ) ) ) > 0 THEN right( ltrim( rtrim( replace( replace( replace( replace( replace( replace( replace( @FullName, ' Jr', '' ), ' III', '' ), ' II', '' ), ' I', '' ), ' Jr.', '' ), ' Sr', ''), 'Sr.', '') ) ) , charindex( ' ', reverse( ltrim( rtrim( replace( replace( replace( replace( replace( replace( replace( @FullName, ' Jr', '' ), ' III', '' ), ' II', '' ), ' I', '' ), ' Jr.', '' ), ' Sr', ''), 'Sr.', '') ) ) ) ) - 1 ) ELSE '' END , 25 ) END RETURN @RetName END 

ОБЛАСТЬ ПРИМЕНЕНИЯ:

 SELECT dbo.ufn_GetFirstName(Fullname) as FirstName, dbo.ufn_GetLastName(Fullname) as LastName FROM #Names 

Вы можете сделать это, если имя и фамилия разделены пробелом:

 SELECT SUBSTRING(FirstAndSurnameCol, 0, CHARINDEX(' ', FirstAndSurnameCol)) Firstname, SUBSTRING(FirstAndSurnameCol, CHARINDEX(' ', FirstAndSurnameCol)-1, LEN(FirstAndSurnameCol)) Surname FROM ... 

У вас могут быть проблемы, если полное имя не содержит пробела. Предполагая, что весь FullName переходит к Фамилии, если нет места, а FirstName становится пустой строкой, вы можете использовать это:

 SELECT RTRIM(LEFT(FullName, CHARINDEX(' ', FullName))) AS FirstName, SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, 8000) AS LastName FROM MyNameTable; 

Я думаю, что ниже запрос будет полезен для разделения FirstName и LastName из FullName, даже если есть только FirstName. Например: « Филипп Джон » можно разделить на Филиппа и Джона . Но если есть только Филипп , из-за charIndex of Space будет 0, это даст вам только ».

Попробуйте ниже.

 declare @FullName varchar(100)='Philp John' Select LTRIM(RTRIM(SUBSTRING(@FullName, 0, CHARINDEX(' ', @FullName+' ')))) As FirstName , LTRIM(RTRIM(SUBSTRING(@FullName, CHARINDEX(' ', @FullName+' ')+1, 8000)))As LastName 

Надеюсь, что это поможет вам. 🙂

Нижеприведенный код работает со строками Last, First M. Замените «Имя» на имя столбца имени строки. Поскольку у вас есть период как окончательный символ, когда есть средний начальный, вы замените 2 на 3 в каждой из строк (2, 6 и 8) – и измените «ПРАВО (Name, 1)» на «RIGHT» (Имя, 2) “в строке 8.

 SELECT SUBSTRING(Name, 1, CHARINDEX(',', Name) - 1) LastName , CASE WHEN LEFT(RIGHT(Name, 2), 1) <> ' ' THEN LTRIM(SUBSTRING(Name, CHARINDEX(',', Name) + 1, 99)) ELSE LEFT(LTRIM(SUBSTRING(Name, CHARINDEX(',', Name) + 1, 99)), LEN(LTRIM(SUBSTRING(Name, CHARINDEX(',', Name) + 1, 99))) - 2) END FirstName , CASE WHEN LEFT(RIGHT(Name, 2), 1) = ' ' THEN RIGHT(Name, 1) ELSE NULL END MiddleName 
  • Повороты с динамическими столбцами в SQL Server
  • Как получить последнюю запись для каждой группы в SQL
  • Усекать время от времени до второго (удалить миллисекунды) в T-SQL
  • Как сделать SQL как% в Linq?
  • Как преобразовать строку dd / mm / yyyy в datetime в SQL Server?
  • Каковы варианты использования CHAR над VARCHAR в SQL?
  • Как получить результат sp_executesql в переменную?
  • Сравните DATETIME и DATE, игнорируя временную часть
  • Как проверить, существует ли столбец в таблице SQL Server?
  • t-sql получить все даты между двумя датами
  • Преобразование Xml в таблицу SQL Server
  • Давайте будем гением компьютера.