Страницы

Поиск по вопросам

четверг, 11 апреля 2019 г.

Запрос в SQL (сортировка)

Есть Таблица 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

Комментариев нет:

Отправить комментарий