@TooRgon

Sql сортировка со сложным условием?

Помогите сформировать запрос к таблице вида :
Tab1
|num| FIO |
|1|Петров Сергей Валерьевич|
|2| Смирнов Сергей Сергеевич |
|3|Иванов Иван Иванович |
|4|Сергеева Ирина Ивановна |
|5|Сковорода Станислав Серафимович|
|6|Сезам Селена Ивановна |

На выборку соответствий начала слов со строкой "Се" не выводя повторы при двойном совпадении, причём результат отсортировать по наличию соответствий в первом, втором и третьем слове по порядку. А внутри соответствии по слову сортировать по алфавиту. Пример результата :

Сезам Селена Ивановна
Сергеева Ирина Ивановна
Петров Сергей Валерьевич
Смирнов Сергей Сергеевич
Сковорода Станислав Серафимович

Привести таблицу к нормальному виду не представляется возможным.
  • Вопрос задан
  • 209 просмотров
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
для начала like %се%

разбить поле по пробелам, найти номер слова, в котором вхождение

найти позицию в слове

PATINDEX-ом найти позицию в строке, получить следующий символ.

в итоге sort by позиция_в_слове, номер_слова, следующий_символ
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А что тут сложного? Объединение трёх поисков по регулярке с нужной сортировкой. Только запрос получится небыстрый.
SELECT `FIO` AS `fio`, 1 AS `position`
  FROM `test`
  WHERE `FIO` REGEXP CONCAT('^ *', :needle)
UNION SELECT `FIO`, 2
  FROM `test`
  WHERE `FIO` REGEXP CONCAT('^ *[^ ]+ +', :needle)
    AND NOT `FIO` REGEXP CONCAT('^ *', :needle)
UNION SELECT `FIO`, 3
  FROM `test`
  WHERE `FIO` REGEXP CONCAT('^ *[^ ]+ +[^ +] +', :needle)
    AND NOT `FIO` REGEXP CONCAT('^ *[^ ]+ +', :needle)
    AND NOT `FIO` REGEXP CONCAT('^ *', :needle)
ORDER BY `position`, TRIM(`fio`);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы