【问题标题】:SQLite returning data in custom orderSQLite 按自定义顺序返回数据
【发布时间】:2013-07-17 10:41:20
【问题描述】:

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

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

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

这可能吗?

【问题讨论】:

  • 你想按顺序获取数据吗?
  • 以我对 SQL 的一点了解,如果不使用某种技巧,这是不可能的
  • 你可以按照你想要的顺序保留一个stationID数组,然后使用NSComparator可以对resultsArray进行排序。
  • 当然,您可以按顺序获取值。如果 StationID 上有索引,则使用编译后的语句,它的运行速度应该与上述一样快。

标签: sqlite sql-order-by


【解决方案1】:

对结果进行排序的简单方法

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)];
}];

【讨论】:

    【解决方案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
    

    【讨论】:

    • 此解决方案仅在列表中没有重复值的情况下有效,否则结果将仅显示第一次出现。
    • @neowinston ID 应该是主键,因此不能有重复值。
    • @Vivid Kraig 观察力不错。感谢您指出这一点。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        第二种方法(第一种方法是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.
        

        【讨论】:

          猜你喜欢
          • 2011-03-19
          • 2018-03-31
          • 2018-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-17
          • 2018-01-09
          • 2021-04-02
          相关资源
          最近更新 更多