Сортировать по регистру: где значение LIKE, затем POSITION - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть набор результатов, который нужно отсортировать соответственно:

  • если значение столбца похоже на 'Qwerty%', поместите его сверху, а затем сортируйте по ПОЗИЦИИ по возрастанию
  • если значение столбца не похоже на 'Qwerty%', добавьте его в вышеупомянутый набор результатов 'Qwerty%' и упорядочите их по POSITION по возрастанию

Например, набор результатов, как показано ниже:

 NAME                |    POSITION
 ---------------------------------
 entitlement         |    4
 threaten            |    1
 Qwerty Name         |    1
 Qwerty architecture |    7
 drown               |    6
 expectation         |    2
 clash               |    3
 foot                |    7
 ask                 |    10
 Qwerty structure    |    11
 Qwerty therapist    |    3

Должен быть возвращен в следующем порядке:

 NAME                |    POSITION
 ---------------------------------
 Qwerty Name         |    1
 Qwerty therapist    |    3
 Qwerty architecture |    7
 Qwerty structure    |    11
 threaten            |    1
 expectation         |    2
 clash               |    3
 entitlement         |    4
 drown               |    6
 foot                |    7
 ask                 |    10

До сих пор я придумал это:

SELECT NAME, POSITION FROM TABLE_NAME
ORDER BY CASE NAME
    WHEN NAME LIKE 'Qwerty%' THEN CONCAT('A', NAME)
    ELSE POSITION END

Но набор результатов возвращается неверно, как показано ниже

 NAME                |    POSITION
 ---------------------------------
 Qwerty Name         |    1
 Qwerty structure    |    11
 Qwerty therapist    |    3
 Qwerty architecture |    7
 threaten            |    1
 drown               |    6
 expectation         |    2
 ask                 |    10
 foot                |    7
 clash               |    3
 entitlement         |    4

Как видите, сортировка по именам, в которых нет 'Qwerty%', не производится, а те, которые не сортируют по POSITION правильно.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вам нужно два уровня сортировки в предложении ORDER BY:

SELECT NAME, POSITION
FROM TABLE_NAME
ORDER BY
    CASE WHEN NAME LIKE 'Qwerty%' THEN 0 ELSE 1 END,
    POSITION;

enter image description here

Демо

Вот еще одна, немного более аккуратная, версия запроса, использующая REGEXP вместо выражения CASE:

SELECT NAME, POSITION
FROM TABLE_NAME
ORDER BY
    NAME NOT REGEXP 'Qwerty',
    POSITION;
0 голосов
/ 06 сентября 2018

Попробуйте это:

SELECT NAME, POSITION, SUM (CASE WHEN NAME LIKE 'Qwerty%' THEN 0 ELSE 1 END) AS Sort
FROM TABLE_NAME
ORDER BY Sort, POSITION
...