【问题标题】:How to split one column into two columns in SQL Server如何在 SQL Server 中将一列拆分为两列
【发布时间】:2014-03-26 05:28:49
【问题描述】:

我有一个关于 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 中使用查询的问题

【问题讨论】:

  • 如果您此时可以更改设计,那么我建议您这样做。将名称保存到两个字段中。这是一个更好的设计。
  • 你绝对会得到预期的结果——你只是从来没有真正把注意力放在你写的东西上。看,对于 nani (id 2) 没有 _,因此 charindex 将返回 NULL,这不是子字符串的有效输入(因此您需要在那里合并将其转换为数字)。然后在您的 putpu 中,“无”究竟来自哪里?

标签: sql-server sql-server-2012


【解决方案1】:

试试这个:

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 命令来控制姓氏是否可用。

SQL Fiddle

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

Results

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

更新:添加了 sqlfiddle

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      您错过了字符串中没有下划线的情况,这会导致错误。相反,请尝试:

      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
      

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

      【讨论】:

        【解决方案4】:
        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多