SQLite以自定义顺序返回数据

时间:2013-07-17 10:41:21

标签: sqlite sql-order-by

我正在使用SQLite查询(在iOS应用程序中),如下所示:

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

但是,我正在以降序或升序获得结果数据,而我真正想要的是按照我在IN子句中指定的顺序返回数据。

这可能吗?

5 个答案:

答案 0 :(得分: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)];
}];

答案 1 :(得分:2)

我不相信有任何方法可以按照不是升序,降序或随机的顺序返回SQL数据(有意地,或者只是按照数据库引擎选择返回数据的顺序)。

因此,简单地获取SQLite查询返回的所有数据并将其存储在键入StationID值的NSDictionary中可能是有意义的。按照您需要的顺序检索将是微不足道的。

答案 2 :(得分: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

答案 3 :(得分:1)

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

答案 4 :(得分: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.