2

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

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

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

这可能吗?

4

5 回答 5

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)];
}];
于 2013-07-17T11:07:11.457 回答
3

您可以使用CASE 表达式将这些站 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
于 2013-07-17T12:21:38.303 回答
1

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

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

于 2013-07-17T10:45:32.940 回答
1

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

于 2013-07-17T11:07:01.277 回答
1

第二种方法(第一种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.
于 2017-11-18T17:24:41.100 回答