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.
编辑:此解决方案适用于 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)
归档时间: |
|
查看次数: |
5512 次 |
最近记录: |