2016-01-06 27 views
3

我有一个表tblPerson和列fullnameSQL:单独的列值为多列

-------------- 
fullname 
-------------- 
Garcia, John C. 
Herdan, Stephen S. 
Ubico, Ed Z. 

我想,以获得最后的,第一和中间名分别建立3列爆炸的全名列。

我使用MS SQL Server 2008 R2

输出:

------------------------------------------------------------------------ 
    fullname    lname    fname    mname 
------------------------------------------------------------------------ 
Garcia, John C.   Garcia,   John    C. 
Herdan, Stephen S.  Herdan,   Stephen    S. 
Ubico, Ed Z.    Ubico,   Ed     Z. 

预先感谢您

+2

你尝试过这么远吗?请也看看:http://stackoverflow.com/questions/2647/how-do-i-split-a-string-so-i-can-access-item-x –

回答

3

最简单的解决办法是,

SELECT fullname,REVERSE(PARSENAME(REPLACE(REVERSE(fullname) ,' ' ,'.') ,1)) AS lname 
     ,REVERSE(PARSENAME(REPLACE(REVERSE(fullname) ,' ' ,'.') ,2)) AS fname 
     ,REVERSE(PARSENAME(REPLACE(REVERSE(fullname) ,' ' ,'.') ,3)) AS mname 
FROM tblPerson 

OR

SELECT fullname,REVERSE(PARSENAME(REPLACE(REVERSE(fullname) ,' ' ,'.') ,1)) AS lname 
     ,REVERSE(PARSENAME(REPLACE(REVERSE(fullname) ,' ' ,'.') ,2)) AS fname 
     ,STUFF(fullname, 1, Len(fullname) +1- CHARINDEX(' ',Reverse(fullname)), '') mname 
FROM tblPerson 

sql fiddle demo

+0

当我尝试这个有一个姓之后的额外逗号和mname之后的无点。简单修复当然... –

+0

你检查了我更新的答案吗?顺便说一句,你已经显示了你的预期输出,最后带有“,”的lname。 – pedram

+0

我不是问题提问者......但你是对的,我错过了他把逗号在那里... –

1

这人会支持多字的姓氏与名字:

SELECT 
CASE WHEN fullname LIKE '%, %' THEN SUBSTRING(fullname, 1, CHARINDEX(', ', fullname)) ELSE fullname END AS lname, 
CASE 
WHEN fullname LIKE '%, % %.' THEN SUBSTRING(fullname, CHARINDEX(', ', fullname)+2, LEN(fullname)-CHARINDEX(' ', REVERSE(fullname)) - CHARINDEX(', ', fullname)-1) 
WHEN fullname LIKE '%, %' THEN SUBSTRING(fullname, CHARINDEX(', ', fullname)+2, LEN(fullname)- CHARINDEX(', ', fullname)-1) 
END AS fname, 
CASE WHEN fullname LIKE '%, % %.' THEN SUBSTRING(fullname, LEN(fullname)-CHARINDEX(' ', REVERSE(fullname)) + 2, 1000) END AS mname 
FROM tblPerson 
1

尝试;

;with data_tbl as (
    select [fullname], 
    CHARINDEX(',', [fullname]) + 1 index_comma, 
    CHARINDEX(' ', [fullname], CHARINDEX(',', [fullname]) + 2) index_space, 
    len([fullname]) len_name 
    from tblPerson 
    --where [fullname] like '%, % %' 
) 
select 
    [fullname], 
    left([fullname], index_comma - 1) lname, 
    substring([fullname], index_comma, index_space - index_comma) fname, 
    substring([fullname], index_space, len_name) mname 
from data_tbl 

sql fiddle demo

如果添加where条件where [fullname] like '%, % %'那么它会忽略所有的fullname不是在fromat %, % %