簡體   English   中英

SQL Replace查詢從名稱包含(MR。,MRS。,MR / MRS…)中刪除前綴

[英]SQL Replace query to remove prefix from name contains (MR., MRS., MR / MRS…)

我有這樣的內容表

tblEmployees

employeeID       employeeName
___________________________________
    1       Jeffrey L. JR Van Hoosear
    2       DAVID GUNGNER MR
    3       CATHLEEN E STADECKER MRS.
    4       MARTIN W SCHIFFMILLER
    5       JAY F MOLDOVANYI VI

另一個像這樣的桌子

tblPrefix

prefixID       Prefix
_________________________
    1           JR
    2           MR
    3           MR / MRS
    4           JR.
    5           MRS.
    6           I
    7           II
    8           III
    9           IV
   10           V
   11           VI
   12           VII

現在我想刪除EmployeeName中存在的前綴(JR,JR。,MR,MRS .....)。

我寫了一個函數。 對於該功能,我已經將Employee名稱作為參數傳遞給了

SELECT * FROM fn_SplitName (@employeeName) (Table-Valued Function)

我嘗試過這樣

SELECT REPLACE(@employeeName,preFix,'') 
FROM tblPrefix 
WHERE @employeeName LIKE '% ' + preFix + ' %'

預期輸出

employeeID       employeeName
___________________________________
    1       Jeffrey L. Van Hoosear
    2       DAVID GUNGNER
    3       CATHLEEN E STADECKER
    4       MARTIN W SCHIFFMILLER
    5       JAY F MOLDOVANYI

與第一個tblEmpoyee進行比較

Oracle查詢:

select employeeName, REPLACE(employeeName, PREFIX,'')  
from employee_table, prefix_table
WHERE INSTR(employeeName, PREFIX) > 0

SQL Server中 ,我認為應該是:

select employeeName, REPLACE(employeeName, PREFIX,'')  
from employee_table, prefix_table
WHERE CHARINDEX(PREFIX,employeeName) > 0

以下查詢選擇以前綴開頭或結尾的employeeNames。 然后,使用SUBSTRING函數將前綴刪除employeeName。

編輯 :更正了CASE語句。

SELECT te.employeeName, 
    CASE
        WHEN te.employeeName like '%'+' '+tp.Prefix THEN SUBSTRING(te.employeeName, 1, LEN(te.employeeName)-LEN(tp.Prefix)-1)
        WHEN te.employeeName like tp.Prefix+' '+'%' THEN SUBSTRING(te.employeeName, LEN(tp.Prefix)+2, LEN(te.employeeName)-LEN(tp.Prefix)-1)
    END employeeName_without_Prefix
FROM tblEmployees te
INNER JOIN tblPrefix tp ON te.employeeName like '%'+' '+tp.Prefix OR te.employeeName like tp.Prefix+' '+'%';

上面的查詢不會無意中替換在employeeName中間出現的前綴字符。

SQL Fiddle演示

您可以將SQL語句嵌入到函數中,如下所示。 但是,請注意,該函數的執行速度會較慢,因為它會針對每個employeeName逐一執行。

CREATE FUNCTION dbo.remove_prefix (@employeeName varchar(100))
RETURNS varchar(100)
AS
BEGIN
    DECLARE @employeeName_without_Prefix   varchar(100)

SELECT @employeeName_without_Prefix = 
    CASE
        WHEN te.employeeName like '%'+' '+tp.Prefix THEN SUBSTRING(te.employeeName, 1, LEN(te.employeeName)-LEN(tp.Prefix)-1)
        WHEN te.employeeName like tp.Prefix+' '+'%' THEN SUBSTRING(te.employeeName, LEN(tp.Prefix)+2, LEN(te.employeeName)-LEN(tp.Prefix)-1)
    END employeeName_without_Prefix
FROM tblEmployees te
INNER JOIN tblPrefix tp ON te.employeeName like '%'+' '+tp.Prefix OR te.employeeName like tp.Prefix+' '+'%';
     RETURN (@employeeName_without_Prefix);
END;

參考

在MSDN上創建函數

您的查詢也可以更改為:

SELECT REPLACE(@employeeName,preFix,'') 
FROM tblPrefix 
WHERE 
(
@employeeName LIKE '% ' + preFix + ' %'
OR @employeeName LIKE '%' + preFix + ' %'
OR @employeeName LIKE '% ' + preFix + '%'
OR @employeeName LIKE '%' + preFix + '%'
);

在以下情況下,您需要處理可能出現名稱的情況:

  • '(space)PREFIX(space)' ->名稱之間由空格包圍的前綴。

    例如:Jeffrey L. JR Van Hoosear

  • 'PREFIX(space)' ->名稱以前綴開頭,后跟空格,然后是名稱

    例如:JR Jeffrey

  • '(space)PREFIX' ->以空格和前綴結尾的名稱

    例如:Jeffrey JR

  • 'PREFIX' ->沒有空格

    示例:JR

下列

| Jeffrey L. JR Van Hoosear |
|         GEORGE WASHINGTON |
|           MARTHA D CUSTIS |
|          JOHN VON NEUMANN |
|          ROBERT G MONDAVI |

不能解決“ JR”的原因是:

select
        ca3.employeeName
from tblEmployees 
cross apply (
             select
                    charindex(' ',employeeName)
                  , charindex(' ',reverse(employeeName))
                  , len(employeeName)
            ) ca1 (posl, posr, wide)
cross apply (
             select 
                    case when posl > 1 then left(employeeName,posl-1) end
                  , case when posr > 1 then right(employeeName,posr-1) end
            ) ca2 (bitl, bitr)
cross apply (
             select 
                    case
                         when bitl in (select prefix from tblPrefix) then
                                 substring(employeeName,posl+1,wide)
                         when bitr in (select prefix from tblPrefix) then
                                 substring(employeeName,1,wide - posr)
                         else
                              employeeName
                    end
            ) ca3 (employeeName)

看到這個sqlfiddle

在“ MR / MRS”上也會失敗

在您的函數中使用此查詢。 IT將刪除在開頭,結尾和中間出現的前綴

SELECT REPLACE(@employeeName,preFix,'') 
FROM tblPrefix 
WHERE @employeeName LIKE '% ' + preFix + ' %'
OR @employeeName LIKE '% ' + preFix
OR @employeeName LIKE preFix + ' %'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM