mysql/sql で文字列の文字をシャッフルする方法、つまり疑似コードのようなものがあるかどうか疑問に思っていました: SELECT SHUFFLE('abcdef')
?
http://dev.mysql.com/doc/refman/5.0/en/string-functions.htmlから何も見つかりませんでした。それを検索すると、文字列ではなく、結果をシャッフルするための解決策が見つかるようです。
mysql/sql で文字列の文字をシャッフルする方法、つまり疑似コードのようなものがあるかどうか疑問に思っていました: SELECT SHUFFLE('abcdef')
?
http://dev.mysql.com/doc/refman/5.0/en/string-functions.htmlから何も見つかりませんでした。それを検索すると、文字列ではなく、結果をシャッフルするための解決策が見つかるようです。
どうぞ:
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相当)で正常にテストされました
編集: このソリューションは Microsoft SQL Server 用です。
ユーザー定義関数で RAND() を使用することは許可されていないため、後でシャッフル関数で使用するビューを作成します。
CREATE VIEW randomView
AS
SELECT RAND() randomResult
GO
実際のシャッフル関数は次のとおりです。
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)
標準 SQL には何もありません - おそらく最善の策は、ユーザー定義関数を作成することです。