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

Sql server 如何在SQL Server中将一列拆分为两列,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一个关于SQL Server的小问题,请告诉我如何解决这个问题 表:emp id name --------------- 1 abc_rao 2 nani 3 hari_babu 4 kalibabu 5 ab_tan 基于该表,我希望输出如下所示 id firstname lastname 1 abc rao 2 nani nothing

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

表:
emp

   id    name
  ---------------
   1    abc_rao
   2    nani
   3    hari_babu
   4    kalibabu
   5    ab_tan
基于该表,我希望输出如下所示

   id   firstname   lastname
   1      abc       rao
   2      nani      nothing
   3      hari      babu
   4      kalibabu  nothing
   5      ab        tan
我试着这样做:

select 
    SUBSTRING(name, 1, CHARINDEX('_', name) - 1) as firstname , 
    SUBSTRING(name, CHARINDEX('_', name) + 1, LEN(name)) as lastname 
from emp
但我并没有得到预期的结果

相反,我得到了一个错误:

味精537,第16级,状态2,第3行
传递给LEFT或SUBSTRING函数的长度参数无效

请告诉我怎么解决这个问题

在SQL Server中使用查询问题尝试以下操作:

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
您可以使用CASE命令来控制姓氏是否可用

MS SQL Server 2008架构设置

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
| FIRSTNAME | LASTNAME |
|-----------|----------|
|       abc |      rao |
|      nani |   (null) |
|      hari |     babu |
|  kalibabu |   (null) |
|        ab |      tan |
查询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
| FIRSTNAME | LASTNAME |
|-----------|----------|
|       abc |      rao |
|      nani |   (null) |
|      hari |     babu |
|  kalibabu |   (null) |
|        ab |      tan |

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
| FIRSTNAME | LASTNAME |
|-----------|----------|
|       abc |      rao |
|      nani |   (null) |
|      hari |     babu |
|  kalibabu |   (null) |
|        ab |      tan |

更新:sqlfiddle添加了

如果字符串中没有下划线,则会导致错误。相反,请尝试:

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

我假设在单个单词的情况下,您希望将它们显示为名字和姓氏。您可以将该值更改为您喜欢的任何值。

如果此时您可以更改设计,我建议您这样做。将名称保存到两个字段中以开始。这是一个更好的设计。你绝对会得到预期的结果——你只是从来没有真正把心思放在你写的东西上。请参阅,对于nani(id 2),没有ux,因此charindex将返回NULL,这对于子字符串来说是无效的输入(因此需要在那里合并以将其转换为数字)。然后在你的putpu里“什么都没有”是从哪里来的?
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