2011-08-04 3 views
4

문자열에 공백으로 구분 된 단어를 정렬하고 정렬 된 문자열을 반환하는 MySQL 저장 함수가 필요합니다. 예를 들어MySQL : 저장된 함수를 사용하여 문자열의 단어를 정렬하는 방법은 무엇입니까?

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

는 PHP 이것은 쉬운 작업이 될 것이지만, MySQL의 저장 기능에 내가 배열을 사용할 수 없습니다, 그래서 조금 지금 붙어입니다. 나는 임시 테이블을 만들 수 있지만, 너무 잔인 해 보인다 ... (그리고 느리다).

아이디어가 있으십니까?

+0

문제는 - 단어를 구문 분석하는 방법입니까? 그것은 MySQL을위한 직업이 아닙니다 ;-) – Devart

+0

u는 mysql 함수를 폭발시킬 수 있습니다. 가능한 한 가지 방법은 임시 테이블 (물론 메모리)에 단어를 저장하는 것입니다. – ajreal

답변

0

밥 베일에게 많은 감사를드립니다!

사용자 지정 구분 기호를 지정하기 위해 약간 제안한 기능을 변경했습니다.

UPDATE :

이 기능은 완벽하지 않습니다. 문자열의 시작 또는 끝이 구분 기호와 같을 때 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; 
관련 문제