Mysql:查找字符串

时间:2016-04-15 06:11:41

标签: mysql string

在mySQL中,如何找到给定字符最长序列的长度?例如,在以下字符串

1325******2h3n***3k2n*

如果我在寻找*字符,结果应为6,因为6 *个字符串是字符串中最长的字符。

3 个答案:

答案 0 :(得分:1)

您可以使用instr和生成的表格UNION来获取它。

-- This query can find up to 10. If more need, need to update the `UNION`.

select max((instr('1325*****2h3n***3k2n*',repeat('*', times)) != 0) * times ) longest_seq
from (select 1 times union select 2 union select 3 union select 4 union select 5 
    union select 6 union select 7 union select 8 union select 9 union select 10) t;

演示:

mysql> select max((instr('1325*****2h3n***3k2n*',repeat('*', times)) != 0) * times ) longest_seq
    -> from (select 1 times union select 2 union select 3 union select 4 union select 5
    -> union select 6 union select 7 union select 8 union select 9 union select 10) t;
+-------------+
| longest_seq |
+-------------+
|           5 |
+-------------+
1 row in set (0.01 sec)

答案 1 :(得分:0)

你所寻找的基本上是最长子串的长度,

你可以找到它的算法here

尝试使用查询来实现这一点并不是一个好主意,

我建议使用存储过程。

答案 2 :(得分:0)

Dylan Su的解决方案很聪明,如果你知道最大字符数很少或者不想要建立一个功能的开销,那么效果很好。

另一方面,无论字符长度如何,以下函数定义之一都可以正常工作,而无需无限期地添加新的UNION语句。

此函数循环遍历字符串中的每个字符,如果它们与重复字符匹配,则递增长度计数器。然后它返回最大长度。

DELIMITER //
CREATE FUNCTION LONGEST_CHARACTER_SEQUENCE(input VARCHAR(255), repeat_character CHAR(1))
RETURNS TINYINT UNSIGNED DETERMINISTIC NO SQL
BEGIN
    DECLARE max_length TINYINT UNSIGNED DEFAULT 0;
    DECLARE length TINYINT UNSIGNED DEFAULT 0;
    DECLARE in_sequence BOOLEAN DEFAULT 0;
    DECLARE position INT DEFAULT 1;
    WHILE position <= LENGTH(input) DO
        IF SUBSTRING(input, position, 1) = repeat_character THEN
            IF in_sequence THEN
                SET length = length + 1;
            ELSE
                SET length = 1;
            END IF;
            IF length > max_length THEN
                SET max_length = length;
            END IF;
            SET in_sequence = 1;
        ELSE
            SET in_sequence = 0;
        END IF;
        SET position = position + 1;
    END WHILE;
    RETURN max_length;
END//
DELIMITER ;

SELECT LONGEST_CHARACTER_SEQUENCE('1325******2h3n***3k2n*', '*');
-- Returns: 6

受到Dylan Su的回答启发,此函数会递增长度计数器,直到INSTR不再返回true。我觉得它更简单。

DELIMITER //
CREATE FUNCTION LONGEST_CHARACTER_SEQUENCE(input VARCHAR(255), repeat_character CHAR(1))
RETURNS TINYINT UNSIGNED DETERMINISTIC NO SQL
BEGIN
    DECLARE length TINYINT UNSIGNED DEFAULT 0;
    WHILE INSTR(input, REPEAT(repeat_character, length + 1)) DO
        SET length = length + 1;
    END WHILE;
    RETURN length;
END//
DELIMITER ;

SELECT LONGEST_CHARACTER_SEQUENCE('1325******2h3n***3k2n*', '*');
-- Also returns: 6