2009-11-14 58 views
2

我有數據,如下面的表格刪除和數據分割成多個列在select語句

alt text

我想刪除從名稱標題(小姐先生,博士等),並希望將數據分割成第一姓名和姓氏,如果有兩個名字存在的話。

我希望在選擇語句。我可以使用CASE語句刪除標題,但無法在同一個case語句中將名稱拆分爲兩部分。

我希望這樣的數據,但在選擇語句,標題刪除和名稱分裂。

alt text

回答

2

你可以做到這一點非常有子容易。你想用空格分割字符串,然後在索引忽略的第一個元素,大致是這樣的:

SELECT SUBSTRING(@ourName, 1, CHARINDEX(' ', @ourName)) AS [First], 
SUBSTRING(@ourName, CHARINDEX(' ', @ourName) + 2, LEN(@ourName)) AS[Last] 

沒有測試,但是這是非常接近你想要做什麼。你會打破串到像數組:但是

[0]前綴 [1]名 [2]姓

而且只抓1和2,這將打破,如果有沒有前綴。

+0

謝謝,明白了。你的答案非常接近我的要求。 – Kashif 2009-11-14 22:44:40

0

您可以結合Jeremy的答案和級聯的CASE語句來實現您的要求。這將是一個相當複雜的句子,但它可以工作。

1

試試下面的UDF

create function dbo.ExtractName(@TheName VARCHAR(200),@Which CHAR(1)) 
returns VARCHAR(100) 
as 
begin 
    declare @Ans VARCHAR(100) 
    -- Get rid of common saluations 
    SET @theName = replace(replace(@theName,'mr.',''),'mrs.','') 
    SET @theName = replace(replace(@theName,'ms',''),'miss','') 
    SET @theName = replace(replace(@theName,'dr.',''),'sir','') 

    SET @Ans = rtrim(ltrim(@theName))+' ' 

    -- Assume last name 
    if @Which = 'L' 
     set @ans = rtrim(substring(@ans,charindex(' ',@ans)+1,99)) 
    else 
     set @ans = left(@ans,charindex(' ',@ans)-1) 

    if len(@ans)='' set @ans= null 

    return @ans 
end 
go 
print dbo.ExtractName('Mr. Rick Pepper','F') 
print dbo.ExtractName('Mr. Rick Pepper','L') 

提取名稱可以是非常複雜的,因爲有大量可能的前綴,有時候名稱上次存儲的,第一。有些名稱有後綴,如Jr.或PHD。希望這個UDF給你一個起點......

0

declare @tbl table (GoodName varchar(50)) 
insert into @tbl select 'Mr.Rick Pepper' 
insert into @tbl select 'Miss Lara Harper' 
insert into @tbl select 'Mrs Kim' 
insert into @tbl select 'Dr.Alan White' 
insert into @tbl select 'Adam Jones' 
insert into @tbl select 'William' 
insert into @tbl select 'Sir Clark' 

--program開始嘗試

select 
case when CHARINDEX(',',FilteredName) = 0 then FilteredName else SUBSTRING(FilteredName,0,CHARINDEX(',',FilteredName)) end as FirstName 
,case when CHARINDEX(',',FilteredName) = 0 then Null else SUBSTRING(FilteredName,CHARINDEX(',',FilteredName)+1,LEN(FilteredName)) end as LastName 
from (
select REPLACE(LTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(GoodName,'Mr.',''),'Miss',''),'Mrs',''),'Dr.',''),'Sir','')),' ',',') as FilteredName 
from @tbl 
)x(FilteredName) 

輸出

名姓

Rick Pepper 
Lara Harper 
Kim NULL 
Alan White 
Adam Jones 
William NULL 
Clark NULL