【问题标题】:Split Strings into columns in SQL Server在 SQL Server 中将字符串拆分为列
【发布时间】:2017-03-06 09:32:19
【问题描述】:

我在学生表中有一个名称字段,它是一个逗号分隔的字符串,格式为“LastName,FirstName,Middle Name”。在 SQL 查询中执行 select 语句时,我需要将其分解为单独的字段。我该如何实现这在 SQL 中?。有时中间初始值不可用。

SUBSTRING(Name,CHARINDEX(',',Name,1)+2,LEN(Name)) AS FirstName,
SUBSTRING(Name,1,CHARINDEX(',',Name,1)-1) AS LastName,

上面的代码在没有中间名的情况下可以正常工作。

【问题讨论】:

  • 你能发布一些示例数据吗?
  • @RaduGheorghiu '例如:詹姆斯,比利,L' '例如:詹姆斯,比利'
  • 那么中间名呢?
  • 所以是姓 (James)、名字 (Billy)、中间名 (L)?
  • @Ullas 那是我的问题

标签: sql sql-server-2008


【解决方案1】:

这应该可以满足您的需求:

declare @tmp table (fullname varchar(100));
insert @tmp values('James, Billy, L'), ('John, Snow');

select
    fullname
    , [Last Name]
    , case
        when charindex(',', Remainder, 0) > 0
            then ltrim(substring(Remainder, 0, charindex(',', Remainder, 0)))
        else ltrim(Remainder)
    end [First Name]
    , case
        when charindex(',', Remainder, 0) = 0
            then NULL
        else ltrim(substring(Remainder, charindex(',', Remainder, 0) + 1, len(Remainder)))
    end [Middle Name]
from
(select
    fullname
    , substring(fullname, 0, charindex(',', fullname, 0))                       [Last Name]
    , substring(fullname, charindex(',', fullname, 0) + 1, len(fullname))       [Remainder]
from @tmp) result;

【讨论】:

    【解决方案2】:

    首先在字符串中找到逗号(,)的出现。然后使用CASE 表达式获取逗号的个数。如果有 2 个逗号,那么我们可以假设中间名也在那里。如果 1 则只有名字和姓氏。然后使用LEFTRIGHTSUBSTRINGCHARINDEX字符串函数的组合。

    查询

    select t.name, 
    left(
        t.name, 
        charindex(',', t.name, 1) - 1
    ) last_name,
    case t.comma_num 
    when 2
    then substring(
             t.name, 
             charindex(',', t.name, 1) + 1, 
             len(name) - 
             (charindex(',', t.name, 1) + 1) - charindex(',', reverse(t.name), 1) + 1
    )
    when 1 
    then right(
             t.name, 
             charindex(',', reverse(t.name), 1) - 1
    )
    else null end as first_name,
    case t.comma_num 
    when 2 
    then right(
             t.name, charindex(',', reverse(t.name), 1) - 1
    ) 
    else null end as middle_name
    from (
        select name, 
        len(name) - len(replace(name, ',', '')) comma_num
        from [your_table_name]
    )t;
    

    Find demo here

    【讨论】:

      【解决方案3】:
      Use CTE and SUBSTRING AND CHARINDEX funntions 
      
      DECLARE @Name VARCHAR(100) = 'James, Billy, L' 
      --DECLARE @Name VARCHAR(100) = 'James, '', L'  
      
      ;WITH _CTE ( SplitedNames ,RemainStr) AS
      (
          SELECT SUBSTRING(@Name,0,CHARINDEX(',',@Name)),
                 SUBSTRING(@Name,CHARINDEX(',',@Name)+1,LEN(@Name))
          UNION ALL
          SELECT CASE WHEN CHARINDEX(',',RemainStr) = 0 THEN RemainStr ELSE       
                 SUBSTRING(RemainStr,0,CHARINDEX(',',RemainStr)) END, 
                 CASE WHEN CHARINDEX(',',RemainStr) = 0 THEN '' ELSE   
                 SUBSTRING(RemainStr,CHARINDEX(',',RemainStr)+1,LEN(RemainStr))  
                 END
          FROM _CTE 
          WHERE RemainStr <> '' 
      )
      
      SELECT SplitedNames FROM _CTE
      

      【讨论】:

      • 我已经有了拆分功能,但是需要将其作为单独的列
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多