如何在ORDER BY if语句中使用ASC/DESC?
现在的问题是:“如何使用if值命令sql语句?”如何在ORDER BY if语句中使用ASC/DESC?
我有一个表,其中我有一个参数和使用这个参数我必须由ASC或DESC命令一个单一的列。我怎样才能实现它?我知道ASC和DESC参数不能在IF块中(并且具有像这样的结构。“IF(Type ='1',ranking,ranking)ASC/DESC”),所以这是在一个选择在基地内的命令的选择替代参数?
例
该表是这样的:
ID | RANKING | TYPE
--------------------
1 | 12 | 1
2 | 10 | 1
3 | 14 | 2
4 | 15 | 2
的类型= 1必须是一个ASC顺序和类型= 2已经成为一个DESC顺序,因此预期的结果我的选择可能是:
ID | RANKING | TYPE
--------------------
2 | 10 | 1
1 | 12 | 1
4 | 15 | 2
3 | 14 | 2
有关它的任何想法?
按类型排序后按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
不知道你在得到什么:“...在一个参数中选择一个基地内的顺序。” - 你无意中在那里写了几句话。
但是,如果这会有所帮助,您可以通过多场这样的命令:
... ORDER BY type ASC, ranking DESC
和秩序的派生值:
... ORDER BY IF(ranking = 2, 1, 0) DESC, ranking ASC
这将首先记录把所有的“2的排名=” ,然后任何其他排名记录升序。
查看预期的输出。排名顺序取决于类型。 – 2012-01-02 20:05:18
是的,排名栏只能用作“排序”的条件,而不适用于订单本身。 – Gabriele 2012-01-02 21:19:16
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这真的比我的回答更好。 – 2012-01-03 03:44:23
测试代码你的意思是你有一个参数的存储过程?它是什么样子的? – 2012-01-02 20:00:53
CREATE TABLE IF NOT EXISTS'test'( 'id' SMALLINT(5)无符号NOT NULL AUTO_INCREMENT, 'ranking' VARCHAR(15)NOT NULL, 'type' TINYINT(1)无符号NOT NULL, PRIMARY KEY( 'id') )ENGINE = InnoDB DEFAULT CHARSET = utf8 AUTO_INCREMENT = 5; INSERT INTO'test'('id','ranking','type')VALUES (1, '12',1), (2, '10',1), (3,'14 ',2), (4,'15',2); – Gabriele 2012-01-02 22:19:31