使用mysql/sql对字符串进行随机播放

kon*_*tur 6 mysql sql string random

我想知道,如果有一些方法可以在mysql/sql中改变字符串的字母,就像伪代码那样:SELECT SHUFFLE('abcdef')

找不到http://dev.mysql.com/doc/refman/5.0/en/string-functions.html中的任何内容,并且搜索它似乎找到了洗牌结果的解决方案,而不是字符串.

Ros*_* II 11

干得好:

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.


sin*_*rus 5

编辑:此解决方案适用于 Microsoft SQL Server。

由于不允许在用户定义的函数中使用 RAND(),我们创建了一个视图以便稍后在我们的 shuffle 函数中使用它:

CREATE VIEW randomView
AS
SELECT RAND() randomResult
GO
Run Code Online (Sandbox Code Playgroud)

实际的shuffle函数如下:

CREATE FUNCTION shuffle(@string NVARCHAR(MAX))
RETURNS NVARCHAR(MAX) AS 
BEGIN

    DECLARE @pos INT 
    DECLARE @char CHAR(1)
    DECLARE @shuffeld NVARCHAR(MAX)
    DECLARE @random DECIMAL(18,18) 

    WHILE LEN(@string) > 0
        BEGIN
            SELECT @random = randomResult FROM randomView
            SET @pos = (CONVERT(INT, @random*1000000) % LEN(@string)) + 1
            SET @char = SUBSTRING(@string, @pos, 1)
            SET @shuffeld = CONCAT(@shuffeld, @char)

            SET @string = CONCAT(SUBSTRING(@string, 1, @pos-1), SUBSTRING(@string, @pos+1, LEN(@string)))
        END

    RETURN @shuffeld

END 
Run Code Online (Sandbox Code Playgroud)

调用函数

DECLARE @string NVARCHAR(MAX) = 'abcdefghijklmnonpqrstuvwxyz0123456789!"§$%&/()='
SELECT dbo.shuffle(@string)
Run Code Online (Sandbox Code Playgroud)

  • 接受的 awnser 在 UDF 中使用 RAND(),这在 MSSQL 中不起作用 (2认同)