2014-10-27 301 views
0

我想用一个简单的SELECT语句和ORDER BY检索数据,但ORDER BY应该有一个回退。按顺序排列

那就是:我的记录已备案的name和字段名sortkey

CREATE TABLE company 
    (`id` int, `name` varchar(10), `sortkey` varchar(10)) 
; 

INSERT INTO company 
    (`id`, `name`, `sortkey`) 
VALUES 
    (1, 'Azzz', ''), 
    (2, 'Bzzz', ''), 
    (3, 'Czzz', 'Aaa') 
; 

我想从一个SELECT语句得到的结果:

Czzz 
Azzz 
Bzzz 

当我有一个sortkey,使用它。如果不是,请使用字段name

Peudo代码:SELECT * FROM company ORDER BY name,sortkey (but prioritize the sortkey);

+1

类似于:ORDER BY IF(sortKey!='',sortKey,name)'? (文档:http://dev.mysql.com/doc/refman/5.5/en/control-flow-functions.html) – 2014-10-27 20:46:26

+0

@RocketHazmat是的,看起来正是我所需要的。如果您将此作为答案发布,我会接受它。 – topskip 2014-10-27 20:47:45

回答

2

我建议使用IF()来确定使用哪个字段。

SELECT * FROM company ORDER BY IF(sortKey != '', sortKey, name) 
1

尝试此查询

SELECT * FROM company 

    ORDER BY CASE 
    WHEN sortkey != '' THEN sortkey 
    WHEN sortkey = '' THEN name 

    END 
+0

工作正常!谢谢 – topskip 2014-10-27 22:10:48

1

您可以通过多列由(排序)使用顺序。

SELECT * FROM company ORDER BY sortkey, name; 
+0

嗯..这看起来应该工作。如果是这样,那比我的回答好。 – 2014-10-27 20:53:03

+0

PO的要求是“当我有一个sortkey时,使用它,如果没有,使用字段名称。”我的解决方案的反例是:如果sortkey不是空的,它将通过sortkey和名字一起进行排序。 PO需要的是如果sortkey不是空的,它将只按sortkey进行排序。在那种情况下,我的解决方案不够好。 – SCV 2014-10-27 20:55:03

+0

声明的结果是1,2和3,但它应该是3,1和2. – topskip 2014-10-27 20:55:49