我正在使用SQLite查询(在iOS应用程序中),如下所示:
SELECT * FROM tblStations WHERE StationID IN ('206','114','113','111','112','213','214','215','602','603','604')
但是,我正在以降序或升序获得结果数据,而我真正想要的是按照我在IN子句中指定的顺序返回数据。
这可能吗?
答案 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.