【问题标题】:Shuffle a string with mysql/sql使用 mysql/sql 随机播放字符串
【发布时间】:2012-08-05 07:08:45
【问题描述】:

我想知道,是否有某种方法可以打乱 mysql/sql 中字符串的字母,即类似于 伪代码SELECT SHUFFLE('abcdef')?

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

【问题讨论】:

    标签: mysql sql string random


    【解决方案1】:

    标准 SQL 中没有任何内容——最好的办法可能是编写用户定义的函数

    【讨论】:

      【解决方案2】:

      给你:

      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 等效)成功测试

      【讨论】:

      • 呃,哇,没想到会这样。我想到的是“聪明”地使用某种字符串操作/ rand 选择来操纵字符串。这超出了我的理解,但我当然要感谢您的努力!我会看看人们提出的其他答案。关于如何使用这样的“函数声明”的任何指针?是否可以将其作为 mysql 查询运行然后使用该功能?
      • 我可以通过 phpmyadmin 添加一个类似的函数,通过从 sql 选项卡执行它吗?虽然这看起来是一个很好的解决方案,但我在这里受限于 mysql4,所以这个解决方案似乎超出了窗口:/
      • 您可以从 phpmyadmin 运行它,但不幸的是,您需要 MySQL 5.0 或更高版本。
      • 是否需要其他配置或版本?得到了 mysql 5.5.9,但是当我尝试运行你的 sql 时出现语法错误。
      • sqlfiddle.com/#!2/14e41/4。您收到的确切错误消息是什么?
      【解决方案3】:

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

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

      CREATE VIEW randomView
      AS
      SELECT RAND() randomResult
      GO
      

      实际的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 
      

      调用函数

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

      【讨论】:

      • 您可能应该添加为什么/以何种方式您的答案与接受的答案不同和/或更好
      • 接受的 awnser 在 UDF 中使用 RAND(),这在 MSSQL 中不起作用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 2017-04-11
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      相关资源
      最近更新 更多