2011-08-04 11 views
4

私は文字列内の単語を(スペースで区切って)ソートし、ソートされた文字列を返すMySQLストアド関数が必要です。例えばMySQL:ストアドファンクションを使用して文字列の単語をソートする方法は?

"The Quick Brown Fox" - >"Brown Fox Quick The"

はPHPで、これは簡単な作業になりますが、MySQLのストアドファンクションで、私は配列を使用することはできませんので、私は少しは今こだわっています。私はテンポラリテーブルを作成することができましたが、これはあまりにも過剰なようです...(そして遅い)。

アイデアはありますか?

+0

問題は - 言葉をどのように解析するのですか? – Devart

+0

あなたは 'mysql explode function'でグーグルできるのですが、1つの方法はテンポラリテーブル(もちろんメモリ)にワードを格納することです – ajreal

答えて

0

Bob Valeに感謝します。

私は、カスタムデリミタを指定するために少しお勧めした機能を変更しました。

UPDATE:

この機能は完璧ではありません。文字列の先頭または末尾が区切り文字と同じで、文字列の1行に1つ以上の区切り文字がある場合はstrangs結果が生成されるため、文字列にはこれが当てはまらないようにする必要があります。

CREATE FUNCTION `SPLIT_SORT`(inString TEXT, inSeparator TEXT) 
RETURNS text CHARSET utf8 
BEGIN 
    DECLARE strings INT DEFAULT 0;  -- number of substrings 
    DECLARE forward INT DEFAULT 1;  -- index for traverse forward thru substrings 
    DECLARE backward INT; -- index for traverse backward thru substrings, position in calc. substrings 
    DECLARE remain TEXT;    -- work area for calc. no of substrings 
-- swap areas TEXT for string compare, INT for numeric compare 
    DECLARE swap1 TEXT;     -- left substring to swap 
    DECLARE swap2 TEXT;     -- right substring to swap 

    SET remain = inString; 
    SET backward = LOCATE(inSeparator, remain); 
    WHILE backward != 0 DO 
    SET strings = strings + 1; 
    SET backward = LOCATE(inSeparator, remain); 
    SET remain = SUBSTRING(remain, backward+1); 
    END WHILE; 
    IF strings < 2 THEN RETURN inString; END IF; 
    REPEAT 
    SET backward = strings; 
    REPEAT 
     SET swap1 = SUBSTRING_INDEX(SUBSTRING_INDEX(inString,inSeparator,backward-1),inSeparator,-1); 
     SET swap2 = SUBSTRING_INDEX(SUBSTRING_INDEX(inString,inSeparator,backward),inSeparator,-1); 
     IF swap1 > swap2 THEN 
     SET inString = TRIM(BOTH inSeparator FROM CONCAT_WS(inSeparator 
     ,SUBSTRING_INDEX(inString,inSeparator,backward-2) 
     ,swap2,swap1 
     ,SUBSTRING_INDEX(inString,inSeparator,(backward-strings)))); 
     END IF; 
     SET backward = backward - 1; 
    UNTIL backward < 2 END REPEAT; 
    SET forward = forward +1; 
    UNTIL forward + 1 > strings 
    END REPEAT; 
RETURN inString; 
END; 
関連する問題