【发布时间】:2018-02-23 09:15:15
【问题描述】:
我对 Oracle Functions 还很陌生,因此为我的天真道歉。
我正在寻找一个函数,将COL_A 中的字符串与COL_B 中的字符串进行比较,然后将字符串中的任何匹配单词输出到COL_C。
例如
-
COL_A = ‘Microsoft Office’,COL_B = ‘Windows Microsoft’,因此COL_C的预期结果是‘Microsoft’ -
COL_A = ‘Microsoft Office’,COL_B = ‘Microsoft Office’,因此COL_C的预期结果是‘Microsoft Office’ -
COL_A = ‘Microsoft Office’,COL_B = ‘Microsoft Windows',因此COL_C的预期结果是‘Microsoft’ -
COL_A = ‘Microsoft Office’,COL_B = ‘Outlook’,因此预期 结果COL_C将是NULL
我确实找到了一个几乎满足要求的函数 (Count sequential matching words in two strings oracle),但是,此函数输出匹配单词的计数,并且仅对单词顺序也匹配的匹配进行分类(出于我的目的,顺序是无关紧要的,并且理想情况下,我希望显示匹配的单词)。
CREATE OR REPLACE FUNCTION STR_WORD_MATCH(
P_STR1 IN VARCHAR2,
P_STR2 IN VARCHAR2 )
RETURN NUMBER
IS
L_STR1 VARCHAR2(4000) := P_STR1;
L_STR2 VARCHAR2(4000) := P_STR2;
L_RES NUMBER DEFAULT 0;
L_DEL_POS1 NUMBER;
L_DEL_POS2 NUMBER;
L_WORD1 VARCHAR2(1000);
L_WORD2 VARCHAR2(1000);
BEGIN
LOOP
L_DEL_POS1 := INSTR(L_STR1,' ');
L_DEL_POS2 := INSTR(L_STR2,' ');
CASE L_DEL_POS1
WHEN 0 THEN
L_WORD1 := L_STR1;
L_STR1 := '';
ELSE
L_WORD1 := SUBSTR(L_STR1,1,L_DEL_POS1 - 1);
END CASE;
CASE L_DEL_POS2
WHEN 0 THEN
L_WORD2 := L_STR2;
L_STR2 := '';
ELSE
L_WORD2 := SUBSTR(L_STR2,1,L_DEL_POS2 - 1);
END CASE;
EXIT
WHEN (L_WORD1 <> L_WORD2) OR ((L_WORD1 IS NULL) OR (L_WORD2 IS NULL));
L_RES := L_RES + 1;
L_STR1 := SUBSTR(L_STR1,L_DEL_POS1 + 1);
L_STR2 := SUBSTR(L_STR2,L_DEL_POS2 + 1);
END LOOP;
RETURN L_RES;
END;
一如既往,我们将不胜感激。
【问题讨论】: