Sql server 在SQL中将字符串的一部分提取为列

Sql server 在SQL中将字符串的一部分提取为列,sql-server,Sql Server,我的源表中有一列名为Name 但该字段包含一个人的全名,包括名字、姓氏和中间名。在生成的表中,我想将它们拆分为3个不同的列。注意:并非所有名称都有中间名 Example : In the source table Name : Kennedy, John F Name : Paul, Sean In the destination field I want LastName : Kennedy FirstName : John MiddleName : F LastName : P

我的源表中有一列名为
Name
但该字段包含一个人的全名,包括名字、姓氏和中间名。在生成的表中,我想将它们拆分为3个不同的列。注意:并非所有名称都有中间名

Example :

In the source table

Name : Kennedy, John F
Name : Paul, Sean

In the destination field I want

LastName :  Kennedy
FirstName : John
MiddleName : F 

LastName : Paul
FirstName : Sean
MiddleName : Null 
我成功地编写了SQL查询以获取姓氏,但无法确定名字和中间名

Code for LastName :

 CASE
                WHEN CHARINDEX(',', (RTRIM([NAME]))) > 0 
                THEN    LEFT((RTRIM([NAME])),CHARINDEX(',',(RTRIM([NAME])))-1)
                ELSE    RTRIM([NAME])
 END as LastName

我正在使用SQL Server作为RDBMS

您也可以尝试使用ParseName()

返回

LastName    FirstName   MiddleName
Kennedy,    John        F
LastName    FirstName   MiddleName
Kennedy,    John        F
Smith,      Jame        
返回

LastName    FirstName   MiddleName
Kennedy,    John        F
LastName    FirstName   MiddleName
Kennedy,    John        F
Smith,      Jame        

这和你已经在用的逻辑是一样的。查找第一个逗号,在逗号后查找第一个空格-中间的所有内容都是“姓氏”,该空格后的所有内容都是“中间名”。您使用的是sql server 2016吗?是的,我使用的是2016。您在2016年是否尝试了
String\u split
函数?当我运行n表时,将@String替换为源列名t,结果生成了一个新表Nulls@HadoopAddict全部为空还是只有一些为空?大多数行,除了总数为百万条记录的结果集中的5-6条记录外,并非所有名称都有中间名。他们中只有少数人。抱歉,没有将此添加到中question@HadoopAddict添加了另一个答案以陷阱为空感谢另一个答案,知道如何去掉姓氏中的逗号“,”吗?@HadoopAddict LastName=Replace(ParseName(Replace(FullName),,,,,,,,,,,”),如果此人没有中间名,也会失败,例如:Smith,Jame的名字是:Smith,但应该是姓氏。@HadoopAddict不在上面列出的示例中,姓氏是Smith,姓氏是Jame。数据问题?i、 e.双空格?前导空格?我在名字后面有尾随空格。即使我删除了所有尾随空格,你的代码给我的lastname也是空的。MiddleName和Jame FirstName一样。这个答案提供一些背景和上下文可能会有所帮助,因为代码相当长。
  --1.Create a Function
    Create FUNCTION [dbo].[fn_GetName]
    (
        @Descripcion nvarchar(max),
        @Tipo nvarchar(50)
    )
    RETURNS NVARCHAR(MAX)
    AS
    BEGIN
    DECLARE @HTML NVARCHAR(MAX)

        declare @Nombre nvarchar(max) = @Descripcion
        declare @Letra nvarchar(1)= ''
        Declare @PrimerBlanco int  = 0
        Declare @Conjunto nvarchar(50)=''
        Declare @Entrada int = 1
        Declare @FueLetra int = 0

        Declare @LastName nvarchar(500)
        Declare @FirstName nvarchar(500)
        Declare @MiddleName nvarchar(500)
        Declare @Resultado nvarchar(500)

        while 1 = 1
        begin 

            set @Letra = LEFT(@Nombre,1)
            set @Conjunto = @Conjunto +''+@Letra

            if @Letra = ' '  and @FueLetra = 1 
            begin 
                set @PrimerBlanco = @PrimerBlanco + 1

                if @PrimerBlanco = 1
                begin 

                    if @Entrada = 1
                    begin 
                        set @Entrada = @Entrada + 1
                        set @LastName = ltrim(rtrim(@Conjunto))
                        GOTO Fin
                    end 

                    if @Entrada = 2
                    begin 
                        set @Entrada = @Entrada + 1
                        set @FirstName = ltrim(rtrim(@Conjunto))
                        GOTO Fin
                    end 

                    if @Entrada = 3
                    begin 
                        set @Entrada = @Entrada + 1
                        set @MiddleName = ltrim(rtrim(@Conjunto))
                        GOTO Fin
                    end 

                    Fin:  
                    set @Conjunto = ''
                    set @FueLetra = 0
                end 

            end 
            else 
            begin 
                set @PrimerBlanco = 0
                if @Letra  = ' '
                begin 
                    set @FueLetra = 0
                end 
                else 
                begin   
                    set @FueLetra = 1
                end 
            end 

            if @Nombre = ''
            begin 
                break
            end 

            Set @Nombre = substring(@Nombre ,2,len(@Nombre))
        end 

        if @tipo = 'LN'
        begin 
            set @Resultado = @LastName
        end 

        if @tipo = 'FN'
        begin 
            set @Resultado = @FirstName
        end 

        if @tipo = 'MN'
        begin 
            set @Resultado = @MiddleName
        end 

        RETURN @Resultado ;
    END    

    --2. Get the value(No matter white space)
Declare @Table as table 
(
    Name nvarchar(max)
)

insert into @Table values ( '              Kennedy,               John                 F')
insert into @Table values ('           Paul,            Sean')

select 
[dbo].[fn_GetName](name,'LN') as LastName,
[dbo].[fn_GetName](name,'FN') as FirstName,
[dbo].[fn_GetName](name,'MN') as MiddleName
from @Table