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