How to split one column into two columns in SQL Server

前端 未结 4 1878
我寻月下人不归
我寻月下人不归 2020-12-06 06:29

I have small question about SQL Server, please tell me how to solve this issue

Table: emp

   id    name
  ---------------
   1    abc_ra         


        
相关标签:
4条回答
  • 2020-12-06 06:30
    declare @table table(name varchar(300))
    insert into @table values('Raj Parmar')
    insert into @table values('Ronak mer')
    insert into @table values('Mayuri nikunj trivedi')
    
    Select 
    DISTINCT name,
       SUBSTRING(name, 1, CHARINDEX(' ', name) - 1) as FirstName,
       RTRIM(LTRIM(REPLACE(REPLACE(name,SUBSTRING(name , 1, CHARINDEX(' ', name) - 1),''),REVERSE( LEFT( REVERSE(name), CHARINDEX(' ', REVERSE(name))-1 ) ),'')))as MiddleName,
       REVERSE( LEFT( REVERSE(name), CHARINDEX(' ', REVERSE(name))-1 ) ) as LastName
    From @table
    
    name                    FirstName      MiddleName          LastName
    Mayuri nikunj trivedi    Mayuri        nikunj               trivedi
    Raj Parmar               Raj                                Parmar
    Ronak mer               Ronak                               mer
    
    0 讨论(0)
  • 2020-12-06 06:43

    You miss the case where there's no underscore in the string, which causes the error. Instead, try:

    select
        case CHARINDEX('_', name) when 0 then name
            else SUBSTRING(name, 1, CHARINDEX('_', name) - 1) end firstName,
    
        case CHARINDEX('_', name) when 0 then name
            else SUBSTRING(name, CHARINDEX('_', name) + 1, LEN(name)) end lastname 
    from emp
    

    I assume in the case of a single word, you want to show them as both the first name and last name. You can change that value to whatever you prefer.

    0 讨论(0)
  • 2020-12-06 06:45

    try this:

    select 
        case when CHARINDEX('_',name)>0 
             then SUBSTRING(name,1,CHARINDEX('_',name)-1) 
             else name end firstname, 
        CASE WHEN CHARINDEX('_',name)>0 
             THEN SUBSTRING(name,CHARINDEX('_',name)+1,len(name))  
             ELSE NULL END as lastname
    from emp
    

    you can use CASE command to control is last name available.

    SQL Fiddle

    MS SQL Server 2008 Schema Setup:

    Query 1:

    declare @t table (id int, name  varchar(50))
    
    insert into @t (id,name) values( 1    ,'abc_rao')
    insert into @t (id,name) values( 2    ,'nani')
    insert into @t (id,name) values( 3    ,'hari_babu')
    insert into @t (id,name) values( 4    ,'kalibabu')
    insert into @t (id,name) values( 5    ,'ab_tan')
    
    select 
        case when CHARINDEX('_',name)>0 
             then SUBSTRING(name,1,CHARINDEX('_',name)-1) 
             else name end firstname, 
        CASE WHEN CHARINDEX('_',name)>0 
             THEN SUBSTRING(name,CHARINDEX('_',name)+1,len(name))  
             ELSE NULL END as lastname
    from @t
    

    Results:

    | FIRSTNAME | LASTNAME |
    |-----------|----------|
    |       abc |      rao |
    |      nani |   (null) |
    |      hari |     babu |
    |  kalibabu |   (null) |
    |        ab |      tan |
    

    UPDATED: sqlfiddle added

    0 讨论(0)
  • 2020-12-06 06:53
    declare @tbl table(name varchar(20))
    
    insert into @tbl values ('Abdul$Rahim')
    
    insert into @tbl values('Tariq$Jameel')
    
    select
    
    PARSENAME(replace(name,'$','.'),2) as firstname,
    PARSENAME(replace(name,'$','.'),1) as lastname
    
    from @tbl
    
    0 讨论(0)
提交回复
热议问题