我了解正常的ASC
和DESC
ORDER BY
条款。
但是,我有一种情况,其中table包含一列unitType
,其中unitType
可以是0,1或2.我需要对结果集进行排序,以便返回的行按特定顺序排列取决于unitType
列的值。
这是我最接近的:
SELECT * FROM `units` WHERE `unitType`=0
union
select * from units where unitType=2
union
select * from units where unitType=1
这会列出我的unitType=0
行,然后列出值为2的行,最后是1.有更好的方法吗?我需要更改此查询以按任何特定顺序获取行,例如2,0,1等。
答案 0 :(得分:6)
SELECT *
FROM units
WHERE unitType IN (0,1,2)
ORDER BY CASE WHEN unitType = 0 THEN 1
WHEN unitType = 2 THEN 2
WHEN unitType = 1 THEN 3
END
答案 1 :(得分:3)
您还可以使用 FIELD()
功能:
SELECT *
FROM units
ORDER BY FIELD(unitType, 0,2,1)
答案 2 :(得分:2)
select * from units
order by
case when unitType = 0 then 1
when unitType = 1 then 3
else 2 end
答案 3 :(得分:2)
我将创建一个单独的SortOrder表(UnitType,Ordinal)并使用它来定义排序。然后,您可以使用UnitType连接到该表,并按顺序对结果进行排序。
答案 4 :(得分:1)
不要将此逻辑“隐藏”在查询的ORDER BY
子句中,而是考虑创建一个表来映射unitType和排序顺序值(例如两列基表),在查询中加入此表并且在SELECT
子句和 ORDER BY
子句中包含排序顺序属性(将排序顺序公开给调用应用程序)。