2015-06-02 5 views
5

Я хочу, чтобы получить все профили, которые первыми в определенном месте (ы):ORDER BY ... IN (...) ASC

SELECT * FROM profile 
WHERE location IN ('a', 'b', 'c') OR isDefault=1 
ORDER BY location IN ('a', 'b') DESC, -- put to the front if location in 'a','b' 
     isDefault DESC,    -- for each of both groups, put default profiles before the others. 
     location ASC     -- and sort each of the up to four groups by location. 

Это бросает ошибку: «Неправильный синтаксис около ключевого слова" В'.". Если я удалю предложение порядка, результаты будут возвращены.

Что здесь не так?

+0

Возможная проблема с вашим запросом является то, что, помимо того, что 'в' не допускаются в' ПОРЯДКА BY', что не будет никакого внутреннего родом мест, вы решили поставить «перед ». Это действительно то, чего вы желаете? _a_ и _b_ окажется в верхней части, но это может быть как _b_ и _a_. – Mackan

+0

@Mackan 'location ASC' сортирует их, поэтому a всегда находится перед b (если isDefault одинаково для обоих), * even *, если я запрашиваю' ORDER BY location IN ('b', 'a') ', и это полностью предназначено. – Alexander

+1

Верно, не знаю, о чем я думал, но это имело смысл, поскольку я думал об этом ;-) – Mackan

ответ

11

Вы можете переписать это, чтобы дать целое назад, который сортируется:

case when location IN ('a', 'b') then 0 else 1 end DESC 
+0

Приятно, но если OP хочет сначала «a, b», тогда потребуется [обратное отображение флагов или 'DESC'] (http://sqlfiddle.com/#!6/31ff8/1) – StuartLC

+0

Вы совершенно правы. Хорошая точка зрения. Благодарю. –

2

Вы не можете использовать IN в ORDER BY. Измените его на:

ORDER BY location ASC, --will sort a, then b, then c 
+1

И как это будет выглядеть '@'? Поскольку значение ASCII '@' меньше, чем 'a', оно будет первым, а не' a'. –

+0

@PatrickHofman рассматривает 'WHERE location IN ('a', 'b', 'c')', как будет отображаться @? – TTeeple

+0

Местоположение '@', например, перед «a». –

1

Так ORDER BY синтаксис:

ORDER BY column_name ASC|DESC, column_name ASC|DESC 

Так

местоположение IN ('a', 'b')

IsDefault

расположение

должны быть имена столбцов

Try:

location DESC 
isDefault DESC 

Также IN могут быть использованы только в выражении WHERE

Источники:

http://www.w3schools.com/sql/sql_in.asp

http://www.w3schools.com/sql/sql_orderby.asp

1

Если вы используете SQL Server 2012 или выше, то вы можете использовать команду IIF() для преобразования истина/ложь выражение в результате, используя минимальный код.

ORDER BY IIF(location IN ('a','b'), 1, 0) ASC