SQL: Как отсортировать / упорядочить результат запроса несколько произвольным образом? - PullRequest
2 голосов
/ 29 ноября 2011

Мне нужно отсортировать результаты запроса в НЕВЫБОРЕННОМ порядке.

Скажем, я ищу "Стул".Я хочу, чтобы все записи, начинающиеся со стула, были перечислены сначала в алфавитном порядке, а затем другие записи, которые содержат «стул», будут перечислены в алфавитном порядке.Так, например, «Синий стул» будет указан после «Синий стул».

Обратите внимание на условия ЗАПУСКА и СОДЕРЖАНИЯ.Как мне реализовать этот вид?Спасибо.

Ответы [ 3 ]

4 голосов
/ 29 ноября 2011

Вы можете использовать ORDER BY с функцией (своей или PATINDEX, как показано ниже), например:

create table test (value varchar(255))
delete from test
insert into test values ('Foo')
insert into test values ('Bar')
insert into test values ('BlueChair')
insert into test values ('Chair')
insert into test values ('NotABlueChair')
insert into test values ('chairs')
insert into test values ('Zoo')

select * from test where value like '%chair%' order by PATINDEX('%chair%', value) 

Возвращает:

Chair
chairs
BlueChair
NotABlueChair 
3 голосов
/ 29 ноября 2011

(Оказывается, это зависит от MySQL)

Самое короткое, что я могу придумать в SQL, это:

SELECT * FROM table
WHERE column LIKE '%chair%'
ORDER BY IF(column LIKE 'chair%', 0, 1), column;

IF дает строки, которые начинаются с 'chair', равны 0, а строки, которые не имеют 1. Порядок сортировки в SQL сортирует строки в соответствии с первым указанным «столбцом», а затем в этом порядке отсортируем по второму и т. д.

Чтобы уточнить, как это будет выглядеть для ORDER BY:

ChairBlack  = 0, 'ChairBlack'
BlackChair  = 1, 'BlackChair'
Hello Chair = 1, 'Hello Chair'
Chair       = 0, 'Chair'

Как сделать так, чтобы это было так:

Chair       = 0, 'Chair'
ChairBlack  = 0, 'ChairBlack'
BlackChair  = 1, 'BlackChair'
Hello Chair = 1, 'Hello Chair'
2 голосов
/ 29 ноября 2011

Как это выглядит?

SELECT *, 1 as sort_pref FROM table WHERE column LIKE 'CHAIR%'
UNION
SELECT *, 2 as sort_pref FROM table WHERE column LIKE '%CHAIR%' AND column NOT LIKE 'CHAIR%'
ORDER BY sort_pref, column
...