2013-07-17 55 views
1

我使用一个SQLite查询(在iOS应用程序),如下所示:SQLite的定制顺序返回数据

SELECT * FROM tblStations WHERE StationID IN ('206','114','113','111','112','213','214','215','602','603','604') 

但是,我越来越得出的数据在任何升序或降序,什么时我真正想要的是按照我在IN子句中指定的顺序返回数据。

这可能吗?

+0

你想要通过订单获取数据? – Balu

+0

由于我对SQL有一点了解,如果不使用某种技巧,这是不可能的。 –

+0

您可以按照您想要的顺序保留一个stationID数组,然后使用'NSComparator'对结果数组进行排序。 – Anupdas

回答

2

我不认为有任何方法以不升序,降序或随机的方式(无论是故意如此,还是仅仅按照数据库引擎选择返回数据的顺序)返回SQL数据。

因此,只需获取SQLite查询返回的所有数据并将其存储在以StationID值为关键字的NSDictionary中就可能有意义。然后,按照您所需的顺序进行检索会很简单。

1

添加一个额外的列用于排序。例如添加一个名为“sortMePlease”的列。根据您的需要填写此列,这意味着stationID 216的行输入1,114输入2,....最后在查询中添加“ORDER BY sortMePlease ASC”。

5

一个微不足道的方式向结果

NSArray *stationIDs = @[@206,@114,@113,@111,@112,@213,@214,@215,@602,@603,@604]; 

NSArray *stations = @[@{@"Id":@(604)},@{@"Id":@(603)},@{@"Id":@(602)},@{@"Id":@(215)}, 
         @{@"Id":@(214)},@{@"Id":@(213)},@{@"Id":@(112)},@{@"Id":@(111)}, 
         @{@"Id":@(113)},@{@"Id":@(114)},@{@"Id":@(206)}]; 

stations = [stations sortedArrayUsingComparator: 
      ^NSComparisonResult(NSDictionary * dict1, NSDictionary *dict2) 
{ 
    NSUInteger index1 = [stationIDs indexOfObject:dict1[@"Id"]]; 
    NSUInteger index2 = [stationIDs indexOfObject:dict2[@"Id"]]; 
    return [@(index1) compare:@(index2)]; 
}]; 
2

你可以使用一个CASE expression这些站ID映射到另一个值适用于分类排序:

SELECT * 
FROM tblStations 
WHERE StationID IN ('206','114','113','111','112', 
        '213','214','215','602','603','604') 
ORDER BY CASE StationID 
     WHEN '206' THEN 1 
     WHEN '114' THEN 2 
     WHEN '113' THEN 3 
     WHEN '111' THEN 4 
     WHEN '112' THEN 5 
     WHEN '213' THEN 6 
     WHEN '214' THEN 7 
     WHEN '215' THEN 8 
     WHEN '602' THEN 9 
     WHEN '603' THEN 10 
     WHEN '604' THEN 11 
     END 
+0

它为我工作。简直不错 –

0

做它的第二个方法(第一个与CASE WHEN ... THEN END已经在另一个答案中已经陈述)是:

ORDER BY StationID=206 DESC, 
     StationID=114 DESC, 
     StationID=113 DESC, 
     StationID=111 DESC, 
     StationID=112 DESC, 
     StationID=213 DESC, 
     etc.