2017-03-06 42 views
0

我在学生表中有一个名称字段,它是以“LastName,FirstName,Middle Name”格式的逗号分隔的字符串。在SQL查询中执行select语句时,我需要将其分解为单独的字段。我怎样才能在SQL中实现这一点?有些时候Middle intial不可用。将字符串拆分为SQL Server中的列

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

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

+1

你可以张贴一些示例数据? –

+0

@RaduGheorghiu'例如:詹姆斯,比利,L' '例如:詹姆斯,比利' – James

+0

那么中间名呢? – Wanderer

回答

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; 
0
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 
+0

我已经有一个拆分功能,但需要这个作为单独的列 – James

1

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

查询

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