We need to combine 3 columns in a database by concatenation. However, the 3 columns may contain overlapping parts and the parts should not be duplicated. For example,
<
Or you could do it in mysql with the following stored function:
DELIMITER //
DROP FUNCTION IF EXISTS concat_with_overlap //
CREATE FUNCTION concat_with_overlap(a VARCHAR(100), b VARCHAR(100))
RETURNS VARCHAR(200) DETERMINISTIC
BEGIN
DECLARE i INT;
DECLARE al INT;
DECLARE bl INT;
SET al = LENGTH(a);
SET bl = LENGTH(a);
IF al=0 THEN
RETURN b;
END IF;
IF bl=0 THEN
RETURN a;
END IF;
IF al < bl THEN
SET i = al;
ELSE
SET i = bl;
END IF;
search: WHILE i > 0 DO
IF RIGHT(a,i) = LEFT(b,i) THEN
RETURN CONCAT(a, SUBSTR(b,i+1));
END IF;
SET i = i - 1;
END WHILE search;
RETURN CONCAT(a,b);
END//
I tried it with your test data:
mysql> select a,b,c,
-> concat_with_overlap( concat_with_overlap( a, b ), c ) as result
-> from testing //
+-------------+---------+--------+-------------+
| a | b | c | result |
+-------------+---------+--------+-------------+
| a | b | c | abc |
| abcde | defgh | ghlmn | abcdefghlmn |
| abcdede | dedefgh | | abcdedefgh |
| abcde | d | ghlmn | abcdedghlmn |
| abcdef | | defghl | abcdefghl |
| abXabXabXac | XabXac | | abXabXabXac |
+-------------+---------+--------+-------------+
6 rows in set (0.00 sec)