假设我有一个查询food
的表SELECT name FROM food ORDER BY name
:
| name
|--------
| Apple
| Banana
| Carrot
| Donut
...
我希望指定将我选择的特定项目固定在顶部(例如,“柠檬”然后是“胡萝卜”),如果它们在表中。像这样:
| name
| -------
| Lemon
| Carrot
| Apple
| Banana
| Donut
...
我可以使用哪种SQL查询来获得这种特定的排序?
答案 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),则可以在需要时轻松地在以后添加其他优先食物,而不会覆盖现有值。