2016-12-22 1 views
-2

Я хочу удалить специальное имя формы, исключая приветственную часть, и нужно отделить первую, фамилию и приветствие.Как удалить специальные символы из имени, за исключением приветствия (Мистер, г-жа, миссис, доктор)?

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 

Заранее спасибо

+0

Возможный дубликат http://stackoverflow.com/questions/5123585/how-to-split-a-single-column-values-to-multiple-column-values ​​ –

ответ

3

Разделение имен может быть скользким уклоном. Однако, если вы ищете первые 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 

Теперь, зачистки символы не-альфа потребует 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 
+0

Спасибо, Джон, это помогло мне после .. несколько изменения – Sans

+0

@Sans Happy помогло. Просто любопытно, какие изменения вы внесли. Возможно, это может мне помочь. –

+0

На самом деле не так мало изменений .. но почти сменил запрос, у вас есть идея от вашего – Sans

1

Попробуйте это решение, надеюсь, что это поможет.

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] 

Выход:

enter image description here

ли редактировать, если вам нужны какие-либо улучшения.

1

Try следующим образом:

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 [email protected] 
UPDATE @EMP SET LAST_NAME=(REPLACE(@NAME,(SUBSTRING(@NAME,0,CHARINDEX(' ',@NAME)+1)),'')) WHERE [email protected] 
IF(CHARINDEX(' ',(SELECT LAST_NAME FROM @EMP WHERE [email protected])))>0 
BEGIN 
    UPDATE @EMP SET LAST_NAME=(SELECT SUBSTRING(LAST_NAME,0,CHARINDEX(' ',LAST_NAME)+1) FROM @EMP WHERE [email protected]) WHERE [email protected]  
    END 
END 
ELSE 
BEGIN 
UPDATE @EMP SET [email protected] WHERE [email protected] 
END 
FETCH NEXT FROM C INTO @NAME,@ID 
END 
CLOSE C 
DEALLOCATE C 
SELECT EMP_NAME,SALUTATION,FIRST_NAME,LAST_NAME FROM @EMP 
+0

за ваши усилия по этому +1. – Vikrant

Смежные вопросы