问题是:“如何使用if值通过sql语句进行排序?”
我有一个表,其中我有一个参数并使用这些参数我必须通过ASC或DESC订购一个列。我怎样才能实现它?
我已经理解ASC和DESC参数不能在IF块中(并且具有类似这样的结构。“IF(Type ='1',排名,排名)ASC / DESC”),所以这是在select in base中对一个参数进行排序的替代方法?
示例
表格如下:
ID | RANKING | TYPE
--------------------
1 | 12 | 1
2 | 10 | 1
3 | 14 | 2
4 | 15 | 2
Type = 1必须是ASC顺序,Type = 2必须是DESC顺序,因此SELECT的预期结果可能是:
ID | RANKING | TYPE
--------------------
2 | 10 | 1
1 | 12 | 1
4 | 15 | 2
3 | 14 | 2
有什么想法吗?
答案 0 :(得分:4)
ORDER BY type
, CASE WHEN type = 1
THEN ranking
ELSE NULL --- implied, this line can be omitted
--- or changed into: ELSE ''
--- or: ELSE someConstant
END
, ranking DESC
答案 1 :(得分:3)
按类型排序后按IF(type=2, -ranking, ranking)
排序怎么样?否定排名将导致该类型的相反顺序。
修改强>
由于ranking
是VARCHAR
列,您需要将其转换为数字才能使用此技术。
SELECT * FROM test ORDER BY type ASC, CAST(ranking as SIGNED)*IF(type = 1, 1, -1) ASC;
您可以直接在sqlfiddle
测试代码答案 2 :(得分:-1)
不确定你得到的是什么:“......在一个基础选择中订购一个参数。” - 你不小心在那里说了几句话。
但如果这有帮助,您可以通过以下多个字段进行排序:
... ORDER BY type ASC, ranking DESC
按衍生值排序:
... ORDER BY IF(ranking = 2, 1, 0) DESC, ranking ASC
将首先放置所有“ranking = 2”记录,然后将任何其他排名记录升序。