SQL SELECT Сортировка по определенной строке

Предположим, у меня есть таблица food, которую я запрашиваю SELECT name FROM food ORDER BY name:

| name
|--------
| Apple
| Banana
| Carrot
| Donut
...

Я хочу указать, что элементы специфический по моему выбору должны быть закреплены вверху (например, «Лимон», а затем «Морковь»), если они находятся в таблице. Вот так:

| name
| -------
| Lemon
| Carrot
| Apple
| Banana
| Donut
...

Какой тип SQL-запроса я могу использовать для получения этой конкретной сортировки?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
0
696
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете использовать оператор 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

Он уже добавил name к пункту order by, так что это хорошо.

Marc 07.03.2019 23:16

это также был единственный ответ, который не был специфичен для РСУБД @ cameraguy258

Raymond Nijland 07.03.2019 23:37

Составьте справочную таблицу следующим образом:

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), вы можете легко добавить другой приоритетный продукт впоследствии, если это необходимо, не перезаписывая уже существующие значения.

Другие вопросы по теме