我正在使用 SQLite 查询(在 iOS 应用程序中),如下所示:
SELECT * FROM tblStations WHERE StationID IN ('206','114','113','111','112','213','214','215','602','603','604')
但是,我以降序或升序获取结果数据,而我真正想要的是按照我在 IN 子句中指定的顺序返回数据。
这可能吗?
我正在使用 SQLite 查询(在 iOS 应用程序中),如下所示:
SELECT * FROM tblStations WHERE StationID IN ('206','114','113','111','112','213','214','215','602','603','604')
但是,我以降序或升序获取结果数据,而我真正想要的是按照我在 IN 子句中指定的顺序返回数据。
这可能吗?
一种对结果进行排序的简单方法
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)];
}];
您可以使用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
我不相信有任何方法可以按非升序、降序或随机的顺序返回 SQL 数据(有意如此,或者只是按照数据库引擎选择返回数据的顺序)。
因此,简单地获取 SQLite 查询返回的所有数据并将其存储在NSDictionary
StationID 值的键控中可能是有意义的。然后按您需要的顺序检索将是微不足道的。
添加一个额外的列用于排序。例如添加一个名为“sortMePlease”的列。根据您的需要填写此列,这意味着对于 stationID 216 的行输入 1,对于 114 输入 2,....最后将“ORDER BY sortMePlease ASC”添加到您的查询中。
第二种方法(第一种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.