【问题标题】:How to remove special characters from name excluding salutation (Mister, Ms., Mrs., Doctor )?如何从名称中删除除称呼之外的特殊字符(先生,女士,夫人,医生)?
【发布时间】:2016-12-22 10:03:51
【问题描述】:

我想删除名字中的特殊字符,不包括称呼部分,并且需要将名字、姓氏和称呼分开。

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

提前致谢

【问题讨论】:

标签: sql-server special-characters


【解决方案1】:

拆分名称可能是一个滑坡。但是,如果您正在寻找前 3 个字符串,请考虑以下内容。容易展开,相信你可以看到1,2,3,...的模式(我没有太多的想象力)

Select A.Emp_Name
      ,Salutation = IsNull(B.Pos1,'')
      ,First_Name = IsNull(B.Pos2,'')
      ,Last_Name  = IsNull(B.Pos3,'')
 From  @Employee_Name A
 Cross Apply (
              Select Pos1 = xDim.value('/x[1]','varchar(max)')
                    ,Pos2 = xDim.value('/x[2]','varchar(max)')
                    ,Pos3 = xDim.value('/x[3]','varchar(max)')
              From (Select Cast('<x>' + Replace([dbo].[udf-Str-Strip-Non-Alphanumeric](A.Emp_Name),' ','</x><x>')+'</x>' as XML) as xDim) A
             ) B

返回

Emp_Name                Salutation  First_Name  Last_Name
Dr. Sana .Singh         Dr          Sana        Singh
Mrs. Ashley;            Mrs         Ashley  
Mr. Simon-              Mr          Simon   
Ms. Ale Martin galyx    Ms          Ale         Martin
Doctor. Blank Smith&    Doctor      Blank       Smith

现在,去除非 ALPHA 字符需要 UDF

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

【讨论】:

  • 谢谢约翰,它帮助了我之后.. 一些变化
  • @Sans 很高兴它有帮助。只是好奇,你做了什么改变。也许它也可以帮助我。
  • 其实不是几处改动..但几乎改变了查询,bt从你那里得到了想法
【解决方案2】:

试试这个解决方案,希望对你有帮助。

  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】:

    尝试如下:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2013-06-30
      • 2018-05-09
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多