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

Sql 删除select语句中的数据并将其拆分为多列,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有如下表所示的数据 我想从名字中删除标题(Mr.Miss、Dr等),如果存在两个名字,我想将数据分为名字和姓氏 我想在select语句中使用这个。我可以使用CASE语句删除标题,但无法在同一CASE语句中将名称拆分为两个 我想要这样的数据,但在select语句中,标题被删除,名称被拆分 使用子字符串可以很容易地完成此操作。您希望按空格分割字符串,然后忽略索引中的第一个元素,大致如下所示: SELECT SUBSTRING(@ourName, 1, CHARINDEX(' ', @ourNam

我有如下表所示的数据

我想从名字中删除标题(Mr.Miss、Dr等),如果存在两个名字,我想将数据分为名字和姓氏

我想在select语句中使用这个。我可以使用CASE语句删除标题,但无法在同一CASE语句中将名称拆分为两个

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


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

SELECT SUBSTRING(@ourName, 1, CHARINDEX(' ', @ourName)) AS [First],
SUBSTRING(@ourName, CHARINDEX(' ', @ourName) + 2, LEN(@ourName)) AS[Last]
未测试,但这与您想要做的非常接近。您将把字符串分成如下数组:

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


只抓取1和2。但是,如果没有前缀,则会中断

您可以将Jeremy答案与连接的案例陈述相结合,以满足您的需求。这将是一个相当复杂的句子,但它可以工作。

试试下面的自定义项

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能给你一个起点…

试试这个

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

谢谢,我知道了。你的回答很接近我的要求。