[英]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語句嵌入到函數中,如下所示。 但是,請注意,該函數的執行速度會較慢,因為它會針對每個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;
參考 :
您的查詢也可以更改為:
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)
在“ 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.