Skip to content

Instantly share code, notes, and snippets.

@bitnbytesio
Created June 29, 2018 06:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bitnbytesio/34d487085c7403706225dfead4aa870f to your computer and use it in GitHub Desktop.
Save bitnbytesio/34d487085c7403706225dfead4aa870f to your computer and use it in GitHub Desktop.
My sql function to count similar words in comma seperated string
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