T-SQL substring - separating first and last name

前端 未结 11 1712
南方客
南方客 2020-11-30 05:50

I have a column which has FirstName and LastName together. I\'m writing a report to separate the FirstName And LastName. How do I get the FirstName and LastName separated in

相关标签:
11条回答
  • 2020-11-30 05:50

    This should work:

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

    Edit: Adopted Aaron's and Jonny's hint with the fixed length of 8000 to avoid unnecessary calculations.

    0 讨论(0)
  • 2020-11-30 05:54

    You may have problems if the Fullname doesn't contain a space. Assuming the whole of FullName goes to Surname if there is no space and FirstName becomes an empty string, then you can use this:

    SELECT
      RTRIM(LEFT(FullName, CHARINDEX(' ', FullName))) AS FirstName,
      SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, 8000) AS LastName
    FROM
      MyNameTable;
    
    0 讨论(0)
  • 2020-11-30 05:57

    The easiest way I can find to do it is:

    SELECT 
      SUBSTRING(FullName, 1, CHARINDEX(' ', FullName) - 1) AS FirstName,
      REVERSE(SUBSTRING(REVERSE(FullName), 1, CHARINDEX(' ', REVERSE(FullName)) - 1)) AS LastName
    FROM
      [PERSON_TABLE]
    
    0 讨论(0)
  • 2020-11-30 05:58
    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
    
    0 讨论(0)
  • 2020-11-30 06:00

    Here is a more elaborated solution with a SQL function:

    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
    

    USE:

    SELECT dbo.ufn_GetFirstName(Fullname) as FirstName, dbo.ufn_GetLastName(Fullname) as LastName FROM #Names
    
    0 讨论(0)
  • 2020-11-30 06:02

    For the last name as in US standards (i.e., last word in the [Full Name] column) and considering first name to include a possible middle initial, middle name, etc.:

    SELECT DISTINCT
                 [Full Name]
                ,REVERSE([Full Name])                   --  to visualize what the formula is doing
                ,CHARINDEX(' ', REVERSE([Full Name]))   --  finds the last space in the string
                ,[Last Name]    =   REVERSE(RTRIM(LTRIM(LEFT(REVERSE([Full Name]), CHARINDEX(' ', REVERSE([Full Name]))))))
                ,[First Name]   =   RTRIM(LTRIM(LEFT([Full Name], LEN([Full Name]) - CHARINDEX(' ', REVERSE([Full Name])))))
    

    FROM ...

    Note that this assumes [Full Name] has no spaces before or after the actual string. Otherwise, use RTRIM and LTRIM to remove these.

    0 讨论(0)
提交回复
热议问题