在select语句中删除数据并将其拆分为多个列

时间:2009-11-14 22:19:52

标签: sql sql-server tsql

我的数据如下表

alt text

我想从名称中删除标题(Miss Miss,Dr等),如果存在两个名称,则希望将数据拆分为名字和姓氏。

我想在select语句中使用它。我可以使用CASE语句删除标题,但无法在相同的case语句中将名称拆分为。

我想要这样的数据,但是在select语句中,标题已删除,名称已拆分。

alt text

4 个答案:

答案 0 :(得分:2)

您可以使用子字符串轻松完成此操作。您希望按空格分割字符串,然后忽略索引中的第一个元素,大致如下:

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

未经测试,但这与您想要做的非常接近。你将把字符串分成如下数组:

[0]前缀 [1]名字 [2]姓氏

只抓住1和2.如果没有前缀,这将会中断。

答案 1 :(得分: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为您提供一个起点...

答案 2 :(得分:0)

您可以将Jeremy答案与连接CASE语句结合使用以完成您的要求。这将是一个相当复杂的句子,但它可以工作。

答案 3 :(得分: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' 

- 计划开始

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)

输出

FirstName LastName

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