2012-01-02 207 views
1

现在的问题是:“如何使用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 

有关它的任何想法?

+0

测试代码你的意思是你有一个参数的存储过程?它是什么样子的? – 2012-01-02 20:00:53

+0

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

回答

2

按类型排序后按IF(type=2, -ranking, ranking)排序怎么样?否定排名会导致该类型的相反顺序。

编辑

由于rankingVARCHAR列,你需要将它转化成一个数字来使用这种技术。

SELECT * FROM test ORDER BY type ASC, CAST(ranking as SIGNED)*IF(type = 1, 1, -1) ASC; 

您可以直接在sqlfiddle

+0

我试过你的解决方案,但它不工作...结果是相同的或不 - – Gabriele 2012-01-02 20:41:36

+0

你可以发布你尝试过的完整的SQL吗? – 2012-01-02 21:56:40

+0

SELECT * FROM'test' ORDER BY type ASC,IF(type = 1,ranking,-ranking)ASC。结果是14/15而不是15/14。 – Gabriele 2012-01-02 22:15:08

-1

不知道你在得到什么:“...在一个参数中选择一个基地内的顺序。” - 你无意中在那里写了几句话。

但是,如果这会有所帮助,您可以通过多场这样的命令:

... ORDER BY type ASC, ranking DESC 

和秩序的派生值:

... ORDER BY IF(ranking = 2, 1, 0) DESC, ranking ASC 

这将首先记录把所有的“2的排名=” ,然后任何其他排名记录升序。

+0

查看预期的输出。排名顺序取决于类型。 – 2012-01-02 20:05:18

+0

是的,排名栏只能用作“排序”的条件,而不适用于订单本身。 – Gabriele 2012-01-02 21:19:16

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 
+2

这个测试代码在以下方向+1这真的比我的回答更好。 – 2012-01-03 03:44:23