【发布时间】:2014-10-19 16:56:42
【问题描述】:
我需要从输入字符串中删除某些关键字并返回新字符串。关键字存储在另一个表中,如 MR、MRS、DR、PVT、PRIVATE、CO、COMPANY、LTD、LIMITED 等。它们是两种关键字 LEADING - MR、MRS、DR 和 TRAILING - PVT、PRIVATE、CO、COMPANY, LTD、LIMITED 等。因此,如果关键字是 LEADING,那么我们必须从开头删除它,如果它是 TRAILING,那么我们必须从最后删除它。例如- MR Jones MRS COMPANY 应该返回 JONES MRS 和 MR MRS Jones PVT COMPANY 应该返回 JONES (如在第一次迭代中 MR 和 PVT 将被修剪,然后单词将变为 MRS JONES PVT 并在第二次迭代中将变为 @ 987654328@。同样MR MRS Doe PVT COMPANY LTD最终会返回DOE。
我必须通过 PL/SQL 来完成。我编写了以下代码,但如果开头或结尾有多个关键字,它将删除所有关键字。当我遍历关键字光标时的原因,如果关键字不在末尾并且循环已经迭代,那么我们不能重用该关键字来替换。请注意,结尾或开头都可以有 n 个关键字:
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
【问题讨论】:
-
如果您显示示例数据(通过编辑您的问题)以及您实际想要从中返回的内容,将会很有帮助。
-
@Gordon - 最后添加了示例输入输出,尽管它已经存在于问题中。
-
@yamny 在我的情况下如何使用正则表达式?
-
问题不在于替换,而是如何在我已经添加的循环之上使用另一个循环,它将检查是否所有关键字都被删除。
-
@Sid 好的,现在我完全理解了你的问题,我认为可以使用
regexp_replace,但我不知道它是否有效。