一尘不染

用mysql / sql洗牌

sql

我想知道,是否有某种方法可以在mysql / sql中改组字符串的字母,即类似 伪代码的内容SELECT SHUFFLE('abcdef')

http://dev.mysql.com/doc/refman/5.0/en/string-
functions.html找不到任何内容,对其进行搜索似乎只是找到改组结果的解决方案,而不是字符串。


阅读 223

收藏
2021-03-10

共1个答案

一尘不染

干得好:

DELIMITER //

DROP FUNCTION IF EXISTS shuffle //

CREATE FUNCTION shuffle(
    v_chars TEXT
)
RETURNS TEXT
NOT DETERMINISTIC -- multiple RAND()'s
NO SQL
SQL SECURITY INVOKER
COMMENT ''
BEGIN
    DECLARE v_retval TEXT DEFAULT '';
    DECLARE u_pos    INT UNSIGNED;
    DECLARE u        INT UNSIGNED;

    SET u = LENGTH(v_chars);
    WHILE u > 0
    DO
      SET u_pos = 1 + FLOOR(RAND() * u);
      SET v_retval = CONCAT(v_retval, MID(v_chars, u_pos, 1));
      SET v_chars = CONCAT(LEFT(v_chars, u_pos - 1), MID(v_chars, u_pos + 1, u));
      SET u = u - 1;
    END WHILE;

    RETURN v_retval;
END;
//

DELIMITER ;

SELECT shuffle('abcdef');

有关输出,请参见sqlfiddle.com

已使用mariadb 10.1成功测试(相当于mysql 5.6)

2021-03-10