Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用charindex以两个逗号更正名称_Sql_Sql Server - Fatal编程技术网

Sql 使用charindex以两个逗号更正名称

Sql 使用charindex以两个逗号更正名称,sql,sql-server,Sql,Sql Server,我需要编写一个SQL查询,用字段名称的正确版本更新字段。目前,我们将员工存储为姓、名,并将实现电子邮件变量,以便我们可以说“Hello First Name Last Name” 我目前有一个工作查询,它可以更正只有一个逗号的地方,但是我需要一个工作方式相同的查询,但是当它们是两个逗号时,例如“Doe,Jr,John”,则显示为“John Doe,Jr” 这将是混乱的,所以你将需要大量的测试样本,但在这里你去。使用REVERSE()查找最后一个逗号,然后使用该位置解析第一个和最后一个逗号 --D

我需要编写一个SQL查询,用字段名称的正确版本更新字段。目前,我们将员工存储为姓、名,并将实现电子邮件变量,以便我们可以说“Hello First Name Last Name”

我目前有一个工作查询,它可以更正只有一个逗号的地方,但是我需要一个工作方式相同的查询,但是当它们是两个逗号时,例如“Doe,Jr,John”,则显示为“John Doe,Jr”


这将是混乱的,所以你将需要大量的测试样本,但在这里你去。使用
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

正确的做法是不要将名字和姓氏存储在同一字段中。然而,我想这超出了你的控制范围。对吗?没错。正确的做法是不要将名字和姓氏存储在同一个字段中。然而,我想这超出了你的控制范围。对吗?没错。这就是我正在寻找的解决方案。谢谢。这是我正在寻找的解决方案。非常感谢。