两个比较有用的字符串函数



DELIMITER // CREATE FUNCTION substr_count(in_haystack mediumtext, in_needle varchar(255), in_offset int unsigned, in_length int unsigned) RETURNS int unsigned LANGUAGE SQL DETERMINISTIC NO SQL SQL SECURITY INVOKER BEGIN DECLARE v_count, v_haystack_len, v_needle_len, v_offset, v_endpos int unsigned DEFAULT 0; SET v_haystack_len = CHAR_LENGTH(in_haystack), v_needle_len = CHAR_LENGTH(in_needle), v_offset = IF(in_offset IS NOT NULL AND in_offset > 0, in_offset, 1), v_endpos = IF(in_length IS NOT NULL AND in_length > 0, v_offset + in_length, v_haystack_len); -- The last offset to use with LOCATE is at v_endpos - v_needle_len. -- That also means that if v_needlen > v_endpos, the count is trivially 0 IF (v_endpos > v_needle_len) THEN SET v_endpos = v_endpos - v_needle_len; WHILE (v_offset < v_endpos) DO SET v_offset = LOCATE(in_needle, in_haystack, v_offset); IF (v_offset > 0) THEN -- v_offset is now the position of the first letter in the needle. -- Skip the length of the needle to avoid double counting. SET v_count = v_count + 1, v_offset = v_offset + v_needle_len; ELSE -- The needle was not found. Set v_offset = v_endpos to exit the loop. SET v_offset = v_endpos; END IF; END WHILE; END IF; RETURN v_count; END// DELIMITER ;

例子:

mysql> SELECT substr_count('a/b/c/d/e', '/', 3, 5);

+--------------------------------------+

| substr_count('a/b/c/d/e', '/', 3, 5) |

+--------------------------------------+

|                                    2 |

+--------------------------------------+

1 row in set (0.00 sec)

2:

DELIMITER //

   CREATE

 FUNCTION substr_by_delim(in_set mediumtext, in_delimiter varchar(255), in_pos int) RETURNS mediumtext

  COMMENT 'Returns the Nth element from a delimited list.'

 LANGUAGE SQL DETERMINISTIC NO SQL SQL SECURITY INVOKER

    BEGIN

      DECLARE v_num_parts int unsigned DEFAULT 0;



      IF (in_pos < 0) THEN

         -- substr_count returns the number of delimiters, add 1 to get the number of parts

         SET v_num_parts = substr_count(in_set, in_delimiter, NULL, NULL) + 1;

         IF (v_num_parts >= ABS(in_pos)) THEN

            -- Add the requested position (which is negative, so is actually a subtraction)

            -- Add 1 as the position is 1 based.

            SET in_pos = v_num_parts + in_pos + 1;

         ELSE

            -- The requested position is out of range, so set in_pos to 0.

            SET in_pos = 0;

         END IF;

      END IF;

      IF (in_pos <= 0 OR in_pos IS NULL OR in_pos > substr_count(in_set, in_delimiter, 0, NULL)+1) THEN

         -- in_pos is not BETWEEN 1 AND #of elements.

         RETURN NULL;

      ELSE

         RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(in_set, in_delimiter, in_pos), in_delimiter, -1);

      END IF;

   END//

DELIMITER ;

例子:

mysql> SELECT substr_by_delim('a,b,c,d,e', ',', 2);

+--------------------------------------+

| substr_by_delim('a,b,c,d,e', ',', 2) |

+--------------------------------------+

| b                                    |

+--------------------------------------+

1 row in set (0.00 sec)

 

mysql> SELECT substr_by_delim('a,b,c,d,e', ',', -2);

+---------------------------------------+

| substr_by_delim('a,b,c,d,e', ',', -2) |

+---------------------------------------+

| d                                     |

+---------------------------------------+

1 row in set (0.00 sec)

 

mysql> SELECT substr_by_delim('a||b||c||d||e', '||', 2);

+-------------------------------------------+

| substr_by_delim('a||b||c||d||e', '||', 2) |

+-------------------------------------------+

| b                                         |

+-------------------------------------------+

1 row in set (0.00 sec)

 

你可能感兴趣的:(字符串函数)