Created
June 29, 2018 06:31
-
-
Save bitnbytesio/34d487085c7403706225dfead4aa870f to your computer and use it in GitHub Desktop.
My sql function to count similar words in comma seperated string
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DROP FUNCTION IF EXISTS SPLIT_STRING; | |
DROP FUNCTION IF EXISTS SIMILAR_WORDS; | |
DELIMITER $$ | |
CREATE FUNCTION SPLIT_STRING(str VARCHAR(255), delim VARCHAR(12), pos INT) | |
RETURNS VARCHAR(255) | |
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos), | |
LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1), | |
delim, ''); | |
END$$ | |
DELIMITER ; | |
DELIMITER $$ | |
CREATE FUNCTION SIMILAR_WORDS( s1 VARCHAR(255), s2 VARCHAR(255) ) | |
RETURNS INT | |
DETERMINISTIC | |
BEGIN | |
-- decalre variables | |
DECLARE s1_len, s2_len, words_len1, words_len2, i, j, c INT; | |
DECLARE s1_char, s2_char,temp VARCHAR(255); | |
-- max strlen=255 | |
SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), j = 0, i = 0, c = 0; | |
IF s1 = s2 THEN | |
RETURN 10; | |
ELSEIF s1_len = 0 THEN | |
RETURN s1_len; | |
ELSEIF s2_len = 0 THEN | |
RETURN s2_len; | |
ELSE | |
SET words_len1 = (LENGTH(s1) - LENGTH(REPLACE(s1, ',', ''))) + 1; | |
SET words_len2 = (LENGTH(s2) - LENGTH(REPLACE(s2, ',', ''))) + 1; | |
IF words_len2 > words_len1 THEN | |
SET words_len1 = words_len1 + words_len2; | |
SET words_len2 = words_len1 - words_len2; | |
SET words_len1 = words_len1 - words_len2; | |
SET temp = s1; | |
SET s1 = s2; | |
SET s2 = temp; | |
END IF; | |
WHILE i < words_len1 DO | |
WHILE j < words_len2 DO | |
SET s1_char = TRIM(SPLIT_STRING(s1, ',', i+1)); | |
SET s2_char = TRIM(SPLIT_STRING(s2, ',', j+1)); | |
IF STRCMP(s1_char, s2_char) = 0 THEN | |
SET c = c + 1; | |
END IF; | |
SET j = j + 1; | |
END WHILE; | |
SET i = i + 1; | |
SET j = 0; | |
END WHILE; | |
END IF; | |
RETURN c; | |
END$$ | |
DELIMITER ; | |
--usage: select SIMILAR_WORDS('Apple,Orange,Lemon,Banana', 'Lemon,Orange') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment