Есть Таблица CITIES, в которой две колонки ID и City. City - список городов РФ.
Надо написать SQL запрос, который вернет из таблицы CITIES список всех городов РФ, отсортированных в следующем порядке
Первое место - Москва
Второе место - Санкт-Петербург
Все последующие места - остальные города РФ, отсортированные в алфавитном порядке от А до Я
Я Попробовал вот так, но не получается.
Select City From Cities where City = 'Moscow'
UNION
Select City From Cities where City = 'Sankt-Peterburg'
UNION
Select City From Cities where City !='Moscow' And City != 'Sankt-Peterburg' Order by City
Ответ
MySQL:
select Id, City
from Cities
order by -field(City, 'Санкт-Петербург','Москва'), City
Функция field() возвращает порядковый номер строки в списке аргументов, если строка не найдена - возвращает 0. В данном случае мы берем ее отрицательной. В итоге Москва даст -2, Спб -1, любые другие города 0. -2 будет первым в порядке сортировки.
Произвольные SQL:
select Id, City
from Cities
order by case City when 'Москва' then 1
when 'Санкт-Петербург' then 2
else 3 end,
City
UPD: Для MSSQL короткая нотация через функцию поиска позиции строки:
select Id, City
from Cities
order by -patindex('%$'+City+'$%','$Санкт-Петербург$Москва$'),
City
И универсальный вариант, что бы потом, не меняя запроса, можно было выносить города в начало: В ту-же таблицу или в отдельную добавляем колонку с порядком сортировки. Если отдельной таблицей, то так:
create table CitySort(City varchar(100) not null primary key, srt int);
-- Хотя конечно по ID было бы более правильно, чем по названию ...
insert into CitySort values('Москва',1), ('Санкт-Петербург',2);
select Id, City
from Cities a
left join CitySort s on s.City=a.City
order by coalesce(s.srt,99999), City
Комментариев нет:
Отправить комментарий