我使用一个SQLite查询(在iOS应用程序),如下所示:SQLite的定制顺序返回数据
SELECT * FROM tblStations WHERE StationID IN ('206','114','113','111','112','213','214','215','602','603','604')
但是,我越来越得出的数据在任何升序或降序,什么时我真正想要的是按照我在IN子句中指定的顺序返回数据。
这可能吗?
我使用一个SQLite查询(在iOS应用程序),如下所示:SQLite的定制顺序返回数据
SELECT * FROM tblStations WHERE StationID IN ('206','114','113','111','112','213','214','215','602','603','604')
但是,我越来越得出的数据在任何升序或降序,什么时我真正想要的是按照我在IN子句中指定的顺序返回数据。
这可能吗?
我不认为有任何方法以不升序,降序或随机的方式(无论是故意如此,还是仅仅按照数据库引擎选择返回数据的顺序)返回SQL数据。
因此,只需获取SQLite查询返回的所有数据并将其存储在以StationID值为关键字的NSDictionary
中就可能有意义。然后,按照您所需的顺序进行检索会很简单。
添加一个额外的列用于排序。例如添加一个名为“sortMePlease”的列。根据您的需要填写此列,这意味着stationID 216的行输入1,114输入2,....最后在查询中添加“ORDER BY sortMePlease ASC”。
一个微不足道的方式向结果
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 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
它为我工作。简直不错 –
做它的第二个方法(第一个与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.
你想要通过订单获取数据? – Balu
由于我对SQL有一点了解,如果不使用某种技巧,这是不可能的。 –
您可以按照您想要的顺序保留一个stationID数组,然后使用'NSComparator'对结果数组进行排序。 – Anupdas