MySQL: как отсортировать слова в строке, используя хранимую функцию? - PullRequest
4 голосов
/ 04 августа 2011

Мне нужна хранимая функция MySQL, которая сортирует слова (разделенные пробелом) в строке и возвращает отсортированную строку.

Например: "The Quick Brown Fox" -> "Brown Fox Quick The"

В PHP это было бы легкой задачей, но в хранимых функциях MySQL я не могу использовать массивы, поэтому я немного застрял. Я мог бы создать временную таблицу, но это кажется излишним ... (и медленно).

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 04 августа 2011

Большое спасибо Бобу Вейлу!

Я немного изменил предложенную им функцию, чтобы указать собственный разделитель.

UPDATE:

Эта функция не идеальна. Он производит странные результаты, когда начало или конец строки совпадает с разделителем, и когда в строке содержится более 1 разделителя, поэтому вам нужно убедиться, что это не так в ваших строках .

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;
0 голосов
/ 04 августа 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...