MR Jones MRS COMPANY应返回JONES MRS,MR MRS Jones PVT COMPANY应返回JONES(因为在第一次迭代中将修剪MR和PVT,然后单词将变成MRS JONES PVT,在第二次迭代中,它将变成JONES。类似地,MR MRS Doe PVT COMPANY LTD最终将返回DOE。
我必须通过PL/SQL实现。我编写了以下代码,但如果有多个关键词位于开头或结尾,它会删除所有关键词。原因是当我循环遍历关键字的光标时,如果已经迭代过不在末尾的关键字,则无法重用该关键字进行替换。请注意,开头或结尾可能有任意数量的关键词:
CREATE OR REPLACE FUNCTION replace_keyword (p_in_name IN VARCHAR2)
RETURN VARCHAR2
IS
l_name VARCHAR2 (4000);
CURSOR c
IS
SELECT *
FROM RSRV_KEY_LKUPS
WHERE ACTIVE = 'Y';
BEGIN
l_name := TRIM (p_in_name);
--Now inside the function we’ll loop through this cursor something like below and replace the value in the input name:
FOR rec IN c
LOOP
IF UPPER (rec.POSITION) = 'LEADING'
AND INSTR (UPPER (l_name), UPPER (rec.KEY_WORD || ' '), 1) > 0
THEN --Rule 3:remove leading name
DBMS_OUTPUT.PUT_LINE ('Value >>' || rec.KEY_WORD);
l_name := LTRIM (UPPER (l_name), rec.KEY_WORD || ' ');
ELSIF UPPER (rec.POSITION) = 'TRAILING'
AND INSTR (UPPER (l_name), UPPER (' ' || rec.KEY_WORD), -1) > 0
THEN --Rule 4:remove trailing name
DBMS_OUTPUT.PUT_LINE ('Value >>' || rec.KEY_WORD);
l_name := RTRIM (UPPER (l_name), ' ' || rec.KEY_WORD);
END IF;
l_name := l_name;
END LOOP;
l_name := REGEXP_REPLACE (l_name, '[[:space:]]{2,}', ' '); --Remove multiple spaces in a word and replace with single blank space
l_name := TRIM (l_name); --Remove the leading and trailing blank spaces
RETURN l_name;
EXCEPTION
WHEN OTHERS
THEN
raise_application_error (
-20001,
'An error was encountered - ' || SQLCODE || ' -ERROR- ' || SQLERRM);
END;
/
非常感谢您提前的帮助。
编辑
样例输入1
MR MRS Jones PVT COMPANY
输出
JONES
示例输入2
MR MRS Doe PVT COMPANY LTD
输出
DOE
regexp_replace,但我不知道它是否高效。 - yamny