按特定行排序的SQL SELECT

3
假设我有一个表food,我查询SELECT name FROM food ORDER BY name
| name
|--------
| Apple
| Banana
| Carrot
| Donut
...

我希望指定我选择的特定项目置顶显示(例如“柠檬”,然后是“胡萝卜”),如果它们在表格中存在。如下图:

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

我该使用什么样的SQL查询才能得到这个特定的排序?
4个回答

10
您可以在ORDER BY子句中使用CASE语句,以优先考虑具有特定名称的项目。以下语句将使用CASE为Lemon和Carrot分配值1和2,其余项目将得到值3。然后,那些被分配了3的剩余项目将按照ORDER BY子句中的第二个表达式进行排序,该表达式只是name列。
SELECT *
FROM food
ORDER BY
  CASE name
    WHEN 'Lemon' THEN 1
    WHEN 'Carrot' THEN 2
    ELSE 3
  END,
  name

1
他已经将 name 添加到了 order by 子句中,所以没问题。 - Marc
这也是唯一一个不特指关系型数据库管理系统的答案。@cameraguy258 - Raymond Nijland

1

创建一个类似这样的查找表:

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

0

很有可能,这将是特定于关系型数据库管理系统的。未指定正在使用的数据库。

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)


0
我会使用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),则可以轻松添加另一个优先级食品,而无需覆盖已存在的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接