SQL SELECT按特定行排序

时间:2019-03-07 22:12:25

标签: sql

假设我有一个查询food的表SELECT name FROM food ORDER BY name

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

我希望指定将我选择的特定项目固定在顶部(例如,“柠檬”然后是“胡萝卜”),如果它们在表中。像这样:

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

我可以使用哪种SQL查询来获得这种特定的排序?

4 个答案:

答案 0 :(得分:10)

您可以在order by子句中使用case语句对具有特定名称的项目进行优先级排序。

以下将通过从情况中为它们分配值1和2来将Lemon和Carrot置于优先级顺序,所有其他值将得到值3。剩余的那些被分配为3的值将由的第二个表达式排序order by子句,它只是名称列。

SELECT *
FROM food
ORDER BY
  CASE name
    WHEN 'Lemon' THEN 1
    WHEN 'Carrot' THEN 2
    ELSE 3
  END,
  name

答案 1 :(得分: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

答案 2 :(得分:0)

有可能,这将取决于RDBMS。未指定正在使用的那个。

常用的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)

答案 3 :(得分: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),则可以在需要时轻松地在以后添加其他优先食物,而不会覆盖现有值。

相关问题