Предположим, у меня есть таблица food, которую я запрашиваю SELECT name FROM food ORDER BY name:
| name
|--------
| Apple
| Banana
| Carrot
| Donut
...
Я хочу указать, что элементы специфический по моему выбору должны быть закреплены вверху (например, «Лимон», а затем «Морковь»), если они находятся в таблице. Вот так:
| name
| -------
| Lemon
| Carrot
| Apple
| Banana
| Donut
...
Какой тип SQL-запроса я могу использовать для получения этой конкретной сортировки?


Вы можете использовать оператор case в своем предложении order by для определения приоритета элементов с определенным именем.
Следующее поместит Лимон и Морковь в приоритетном порядке, присвоив им значения 1 и 2 из случая, где все остальные получат значение 3. Оставшиеся, которым было присвоено 3, затем будут отсортированы по второму выражению в порядке предложение, которое является просто столбцом имени.
SELECT *
FROM food
ORDER BY
CASE name
WHEN 'Lemon' THEN 1
WHEN 'Carrot' THEN 2
ELSE 3
END,
name
это также был единственный ответ, который не был специфичен для РСУБД @ cameraguy258
Составьте справочную таблицу следующим образом:
WITH odering(F, Ord) AS
(
VALUES ('Lemmon', 2),
('Carrot', 1)
)
SELECT name
FROM table t
LEFT JOIN ordering Ord on T.name = Ord.name
ORDER BY COALESCE(Ord.Ord, 0) DESC, Name ASC
Скорее всего, это будет специфично для РСУБД. Используемый не уточняется.
Обычно используемый MySQL предоставляет функцию field(). Подходит для пользовательских сортировок по ограниченным значениям.
mysql> create temporary table food as select 'Apple' as food union select 'Banana' union select 'Carrot' union select 'Donut';
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from food;
+--------+
| food |
+--------+
| Apple |
| Banana |
| Carrot |
| Donut |
+--------+
4 rows in set (0.00 sec)
mysql> select * from food order by field (food, 'Carrot', 'Apple', 'Banana', 'Donut');
+--------+
| food |
+--------+
| Carrot |
| Apple |
| Banana |
| Donut |
+--------+
4 rows in set (0.00 sec)
Я бы использовал CTE и сделал бы так:
WITH FoodOrder(name, foodOrder)
AS
(
SELECT name
, foodOrder = CASE name
WHEN 'Lemon' THEN 200
WHEN 'Carrot' THEN 100
ELSE 0
END
FROM food
)
SELECT name
FROM FoodOrder
ORDER BY foodOrder DESC, name
Обратите внимание, что если вы выберете достаточное расстояние между значениями CASE (0, 100, 200), вы можете легко добавить другой приоритетный продукт впоследствии, если это необходимо, не перезаписывая уже существующие значения.
Он уже добавил
nameк пунктуorder by, так что это хорошо.