Monday, March 8, 2010

Oracle Function Lexical Match

Finds a match if every word in one string is in the other string:

CREATE OR REPLACE FUNCTION LEXICAL_MATCH (STR1   IN VARCHAR2,
STR2 IN VARCHAR2)
RETURN NUMBER
IS
THE_RESULT NUMBER := 0;
POS_SPACE NUMBER;
POS_WORD NUMBER;
SINGLE_WORD VARCHAR2 (250);
-- NOT CASE SENSITIVE COMPARE
STRING1 VARCHAR2 (250) := UPPER (STR1);
STRING2 VARCHAR2 (250) := UPPER (STR2);
BEGIN
-- TEST IF ALREADY A MATCH
IF STRING1 = STRING2
THEN
RETURN (1);
ELSE
-- TEST IF THERE IS A SPACE IN THE STRING
POS_SPACE := INSTR (STRING1, ' ');

IF POS_SPACE <> 0
THEN
LOOP
SINGLE_WORD := SUBSTR (STRING1, 1, POS_SPACE - 1);
STRING1 := SUBSTR (STRING1, POS_SPACE + 1);
POS_WORD := INSTR (STRING2, SINGLE_WORD);

IF POS_WORD = 0
THEN
THE_RESULT := 0;
ELSE
THE_RESULT := 1;
-- REMOVE WORD FROM STRING2 - 3 SCENARIOS: WORD AT THE FRONT, MIDDLE, OR END - DON'T WORRY ABOUT REMOVING SPACES IN STRING2
STRING2 :=
SUBSTR (STRING2, 1, POS_WORD - 1) || SUBSTR (STRING2, POS_WORD + LENGTH (SINGLE_WORD) );
END IF;

-- REPEAT IN THE CASE OF 3 OR MORE WORDS
POS_SPACE := INSTR (STRING1, ' ');

EXIT WHEN POS_SPACE = 0 OR THE_RESULT = 0;
END LOOP;

IF TRIM(STRING1) <> TRIM(STRING2) -- CHECK IF STRING2 STILL HAS MORE WORDS LEFT, IF NOT THE REMAINING WORDS SHOULD MATCH
THEN
THE_RESULT := 0;
END IF;

RETURN (THE_RESULT);
ELSE
RETURN (0); -- NO MATCH AND NO SPACES
END IF;
END IF;
END;
/