Sql 使用charindex以两个逗号更正名称
我需要编写一个SQL查询,用字段名称的正确版本更新字段。目前,我们将员工存储为姓、名,并将实现电子邮件变量,以便我们可以说“Hello First Name Last Name” 我目前有一个工作查询,它可以更正只有一个逗号的地方,但是我需要一个工作方式相同的查询,但是当它们是两个逗号时,例如“Doe,Jr,John”,则显示为“John Doe,Jr”Sql 使用charindex以两个逗号更正名称,sql,sql-server,Sql,Sql Server,我需要编写一个SQL查询,用字段名称的正确版本更新字段。目前,我们将员工存储为姓、名,并将实现电子邮件变量,以便我们可以说“Hello First Name Last Name” 我目前有一个工作查询,它可以更正只有一个逗号的地方,但是我需要一个工作方式相同的查询,但是当它们是两个逗号时,例如“Doe,Jr,John”,则显示为“John Doe,Jr” 这将是混乱的,所以你将需要大量的测试样本,但在这里你去。使用REVERSE()查找最后一个逗号,然后使用该位置解析第一个和最后一个逗号 --D
这将是混乱的,所以你将需要大量的测试样本,但在这里你去。使用
REVERSE()
查找最后一个逗号,然后使用该位置解析第一个和最后一个逗号
--DECLARE @fullname VARCHAR(100) = 'Doe, Jr, John'
--DECLARE @fullname VARCHAR(100) = 'Smith, Mike'
DECLARE @fullname VARCHAR(100) = 'Johnson, Sr, John'
SELECT @fullname AS raw_name,
LTRIM(RTRIM(RIGHT(@fullname, CHARINDEX(',', REVERSE(@fullname), 0)-1))) AS first_name,
LTRIM(RTRIM(LEFT(@fullname, LEN(@fullname)-CHARINDEX(',', REVERSE(@fullname), 0)))) AS last_name,
LTRIM(RTRIM(RIGHT(@fullname, CHARINDEX(',', REVERSE(@fullname), 0)-1))) + ' ' +
LTRIM(RTRIM(LEFT(@fullname, LEN(@fullname)-CHARINDEX(',', REVERSE(@fullname), 0)))) AS full_name
这将是混乱的,所以你将需要大量的测试样本,但在这里你去。使用
REVERSE()
查找最后一个逗号,然后使用该位置解析第一个和最后一个逗号
--DECLARE @fullname VARCHAR(100) = 'Doe, Jr, John'
--DECLARE @fullname VARCHAR(100) = 'Smith, Mike'
DECLARE @fullname VARCHAR(100) = 'Johnson, Sr, John'
SELECT @fullname AS raw_name,
LTRIM(RTRIM(RIGHT(@fullname, CHARINDEX(',', REVERSE(@fullname), 0)-1))) AS first_name,
LTRIM(RTRIM(LEFT(@fullname, LEN(@fullname)-CHARINDEX(',', REVERSE(@fullname), 0)))) AS last_name,
LTRIM(RTRIM(RIGHT(@fullname, CHARINDEX(',', REVERSE(@fullname), 0)-1))) + ' ' +
LTRIM(RTRIM(LEFT(@fullname, LEN(@fullname)-CHARINDEX(',', REVERSE(@fullname), 0)))) AS full_name
这里有一种方法可以完成繁重的工作 示例
Declare @YourTable table (FullName varchar(100))
Insert Into @YourTable values
('Doe, Jr, John')
,('Doe, John')
,('John Doe')
Select A.*
,NewValue = case when Pos2 is Null then Pos1 else
case when Pos3 is Null then concat(Pos2,' ',Pos1) else
case when pos4 is null then concat(Pos3,' ',Pos1,' ',Pos2)
end end end
From @YourTable A
Outer Apply (
Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(100)')))
,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(100)')))
,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(100)')))
,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(100)')))
,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(100)')))
From ( values (cast('<x>' + replace(FullName,',','</x><x>')+'</x>' as xml))) A(xDim)
) B
这里有一种方法可以完成繁重的工作 示例
Declare @YourTable table (FullName varchar(100))
Insert Into @YourTable values
('Doe, Jr, John')
,('Doe, John')
,('John Doe')
Select A.*
,NewValue = case when Pos2 is Null then Pos1 else
case when Pos3 is Null then concat(Pos2,' ',Pos1) else
case when pos4 is null then concat(Pos3,' ',Pos1,' ',Pos2)
end end end
From @YourTable A
Outer Apply (
Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(100)')))
,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(100)')))
,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(100)')))
,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(100)')))
,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(100)')))
From ( values (cast('<x>' + replace(FullName,',','</x><x>')+'</x>' as xml))) A(xDim)
) B
正确的做法是不要将名字和姓氏存储在同一字段中。然而,我想这超出了你的控制范围。对吗?没错。正确的做法是不要将名字和姓氏存储在同一个字段中。然而,我想这超出了你的控制范围。对吗?没错。这就是我正在寻找的解决方案。谢谢。这是我正在寻找的解决方案。非常感谢。