如何在SQL Server中将一列拆分为两列

use*_*912 8 sql-server sql-server-2012

我对SQL Server有一个小问题,请告诉我如何解决这个问题

表: emp

   id    name
  ---------------
   1    abc_rao
   2    nani
   3    hari_babu
   4    kalibabu
   5    ab_tan
Run Code Online (Sandbox Code Playgroud)

基于该表我想要输出如下

   id   firstname   lastname
   1      abc       rao
   2      nani      nothing
   3      hari      babu
   4      kalibabu  nothing
   5      ab        tan
Run Code Online (Sandbox Code Playgroud)

我试过这样的:

select 
    SUBSTRING(name, 1, CHARINDEX('_', name) - 1) as firstname , 
    SUBSTRING(name, CHARINDEX('_', name) + 1, LEN(name)) as lastname 
from emp
Run Code Online (Sandbox Code Playgroud)

但我没有得到完全预期的结果.

相反,我收到一个错误:

消息537,级别16,状态2,行3
传递给LEFT或SUBSTRING函数的长度参数无效.

请告诉我如何解决这个问题

在SQL Server中使用查询问题

Had*_*ifi 16

试试这个:

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
Run Code Online (Sandbox Code Playgroud)

您可以使用CASE命令来控制可用的姓氏.

SQL小提琴

MS SQL Server 2008架构设置:

查询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
Run Code Online (Sandbox Code Playgroud)

结果:

| FIRSTNAME | LASTNAME |
|-----------|----------|
|       abc |      rao |
|      nani |   (null) |
|      hari |     babu |
|  kalibabu |   (null) |
|        ab |      tan |
Run Code Online (Sandbox Code Playgroud)

更新:sqlfiddle补充说