Sql server 如何从姓名中删除除称呼之外的特殊字符(先生、女士、女士、医生)?
我想删除不包括称呼部分的特殊字符表单名称,并需要将名字、姓氏和称呼分开Sql server 如何从姓名中删除除称呼之外的特殊字符(先生、女士、女士、医生)?,sql-server,special-characters,Sql Server,Special Characters,我想删除不包括称呼部分的特殊字符表单名称,并需要将名字、姓氏和称呼分开 Create table Employee_Name(Emp_Name varchar(20)) insert into Employee_Name values('Dr. Sana .Singh'); insert into Employee_Name values('Mrs. Ashley;'); insert into Employee_Name values('Mr. Simon-'); insert into
Create table Employee_Name(Emp_Name varchar(20))
insert into Employee_Name values('Dr. Sana .Singh');
insert into Employee_Name values('Mrs. Ashley;');
insert into Employee_Name values('Mr. Simon-');
insert into Employee_Name values('Ms. Ale Martin galyx');
insert into Employee_Name values('Doctor. Blank Smith&');
I need output to be
Emp_Name Salutation First_Name Last_Name
Dr. Sana Singh Dr. Sana Singh
Mrs. Ashley Mrs. Ashley
Mr. Simon Mr. Simon
Ms. Ale Martin Ms. Ale Martin
Doctor. Blank Smith Doctor. Blank Smith
提前感谢尝试此解决方案,希望对您有所帮助
SELECT
Emp_Name
, Reverse(ParseName(Replace(Reverse(Emp_Name), '', ''), 1)) As [Salutation]
, Reverse(ParseName(Replace(Reverse(Emp_Name), '', ''), 2)) As [First_Name]
, Reverse(ParseName(Replace(Reverse(Emp_Name), '', ''), 3)) As [Last_Name]
FROM (Select Emp_Name from Employee_Name
) As [x]
输出:
如果您需要任何改进,请务必进行编辑。拆分名称可能是一个很难解决的问题。但是,如果你正在寻找前3个字符串,请考虑下面的内容。很容易扩展,我相信你可以看到模式1,2,3,。。。(我没有多少想象力) 现在,剥离非字母字符将需要一个自定义项
CREATE FUNCTION [dbo].[udf-Str-Strip-Non-Alphanumeric](@S varchar(max))
Returns varchar(max)
Begin
Declare @RetVal varchar(max) = ''
;with cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
cte2(N) As (Select Top (IsNull(DataLength(@S),0)) Row_Number() over (Order By (Select NULL)) From cte1 a,cte1 b,cte1 c,cte1 d)
Select @RetVal = @RetVal + Substring(@S,N,1)
From cte2
Where Substring(@S,N,1) Like '[a-z,A-Z,0-9, ]'
Return Replace(@RetVal,' ',' ')
End
--Select [dbo].[udf-Str-Strip-Non-Alphanumeric]('some & text. /+= a and zip 02806') --Returns: some text a and zip 02806
尝试如下:
DECLARE @EMP TABLE (ID INT IDENTITY(1,1),EMP_NAME VARCHAR(100),SALUTATION VARCHAR(100),FIRST_NAME VARCHAR(100),LAST_NAME VARCHAR(100),COMMON VARCHAR(100))
DECLARE @NAME VARCHAR(100),@ID INT
INSERT INTO @EMP (EMP_NAME,SALUTATION,COMMON) SELECT EMP_NAME,SUBSTRING(EMP_NAME,0,CHARINDEX(' ',EMP_NAME)+1),REPLACE(EMP_NAME,(SUBSTRING(EMP_NAME,0,CHARINDEX(' ',EMP_NAME)+1)),'') FROM EMPLOYEE_NAME
DECLARE C CURSOR FOR
SELECT COMMON,ID FROM @EMP
OPEN C
FETCH NEXT FROM C INTO @NAME,@ID
WHILE @@FETCH_STATUS=0
BEGIN
IF(CHARINDEX(' ',@NAME))>0
BEGIN
UPDATE @EMP SET FIRST_NAME=(SELECT SUBSTRING(@NAME,0,CHARINDEX(' ',@NAME)+1)) WHERE ID=@ID
UPDATE @EMP SET LAST_NAME=(REPLACE(@NAME,(SUBSTRING(@NAME,0,CHARINDEX(' ',@NAME)+1)),'')) WHERE ID=@ID
IF(CHARINDEX(' ',(SELECT LAST_NAME FROM @EMP WHERE ID=@ID)))>0
BEGIN
UPDATE @EMP SET LAST_NAME=(SELECT SUBSTRING(LAST_NAME,0,CHARINDEX(' ',LAST_NAME)+1) FROM @EMP WHERE ID=@ID) WHERE ID=@ID
END
END
ELSE
BEGIN
UPDATE @EMP SET FIRST_NAME=@NAME WHERE ID=@ID
END
FETCH NEXT FROM C INTO @NAME,@ID
END
CLOSE C
DEALLOCATE C
SELECT EMP_NAME,SALUTATION,FIRST_NAME,LAST_NAME FROM @EMP
可能是重复的谢谢约翰,它帮助了我之后。。很少的changes@Sans很高兴这有帮助。只是好奇,你做了什么改变。也许这对我也有帮助。事实上不是很少的改变。但是几乎改变了这个问题,英国电信从你那里得到了这个想法
CREATE FUNCTION [dbo].[udf-Str-Strip-Non-Alphanumeric](@S varchar(max))
Returns varchar(max)
Begin
Declare @RetVal varchar(max) = ''
;with cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
cte2(N) As (Select Top (IsNull(DataLength(@S),0)) Row_Number() over (Order By (Select NULL)) From cte1 a,cte1 b,cte1 c,cte1 d)
Select @RetVal = @RetVal + Substring(@S,N,1)
From cte2
Where Substring(@S,N,1) Like '[a-z,A-Z,0-9, ]'
Return Replace(@RetVal,' ',' ')
End
--Select [dbo].[udf-Str-Strip-Non-Alphanumeric]('some & text. /+= a and zip 02806') --Returns: some text a and zip 02806
DECLARE @EMP TABLE (ID INT IDENTITY(1,1),EMP_NAME VARCHAR(100),SALUTATION VARCHAR(100),FIRST_NAME VARCHAR(100),LAST_NAME VARCHAR(100),COMMON VARCHAR(100))
DECLARE @NAME VARCHAR(100),@ID INT
INSERT INTO @EMP (EMP_NAME,SALUTATION,COMMON) SELECT EMP_NAME,SUBSTRING(EMP_NAME,0,CHARINDEX(' ',EMP_NAME)+1),REPLACE(EMP_NAME,(SUBSTRING(EMP_NAME,0,CHARINDEX(' ',EMP_NAME)+1)),'') FROM EMPLOYEE_NAME
DECLARE C CURSOR FOR
SELECT COMMON,ID FROM @EMP
OPEN C
FETCH NEXT FROM C INTO @NAME,@ID
WHILE @@FETCH_STATUS=0
BEGIN
IF(CHARINDEX(' ',@NAME))>0
BEGIN
UPDATE @EMP SET FIRST_NAME=(SELECT SUBSTRING(@NAME,0,CHARINDEX(' ',@NAME)+1)) WHERE ID=@ID
UPDATE @EMP SET LAST_NAME=(REPLACE(@NAME,(SUBSTRING(@NAME,0,CHARINDEX(' ',@NAME)+1)),'')) WHERE ID=@ID
IF(CHARINDEX(' ',(SELECT LAST_NAME FROM @EMP WHERE ID=@ID)))>0
BEGIN
UPDATE @EMP SET LAST_NAME=(SELECT SUBSTRING(LAST_NAME,0,CHARINDEX(' ',LAST_NAME)+1) FROM @EMP WHERE ID=@ID) WHERE ID=@ID
END
END
ELSE
BEGIN
UPDATE @EMP SET FIRST_NAME=@NAME WHERE ID=@ID
END
FETCH NEXT FROM C INTO @NAME,@ID
END
CLOSE C
DEALLOCATE C
SELECT EMP_NAME,SALUTATION,FIRST_NAME,LAST_NAME FROM @EMP