밥 베일에게 많은 감사를드립니다!
사용자 지정 구분 기호를 지정하기 위해 약간 제안한 기능을 변경했습니다.
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;
문제는 - 단어를 구문 분석하는 방법입니까? 그것은 MySQL을위한 직업이 아닙니다 ;-) – Devart
u는 mysql 함수를 폭발시킬 수 있습니다. 가능한 한 가지 방법은 임시 테이블 (물론 메모리)에 단어를 저장하는 것입니다. – ajreal