【问题标题】:Room/SQLite returning two different results in one queryRoom/SQLite 在一个查询中返回两个不同的结果
【发布时间】:2022-01-08 21:02:04
【问题描述】:

所以我有以下查询:

//returns min max value my odomoter field must have
@Query("SELECT MAX(odometer) FROM MaintenanceRecord WHERE vehicleId = :maintenanceVehicleId AND " +
        "maintenanceTs < :dateAsLong")
Maybe<Float> getMinAllowedOdometer(long dateAsLong, int maintenanceVehicleId);


//returns the max value my odometer field is allowed to have 
@Query("SELECT MIN(odometer) FROM MaintenanceRecord WHERE vehicleId = :maintenanceVehicleId AND " +
        "CAST(strftime('%s',DATE(maintenanceTs/1000,'unixepoch'))  AS  integer) > " +
        "CAST(strftime('%s',DATE(:dateAsLong/1000,'unixepoch')) AS integer)")
Maybe<Float> getMaxAllowedOdometer(long dateAsLong,int maintenanceVehicleId);

一个函数返回odometer 列必须具有的最小值,另一个查询返回odometer 列允许具有的最大值。

问题是 BOTH 函数是一个接一个地执行的,因为我需要订阅这两个函数。老实说,这是一种不好的做法。

我可以将这两个查询放在一个查询中并返回Maybe&lt;Float, Float&gt; 作为结果吗? 我的另一个解决方案是同步运行这些功能;而不是Maybe&lt;Float&gt;,,我会直接返回Float.

【问题讨论】:

    标签: android sqlite android-sqlite android-room conditional-aggregation


    【解决方案1】:

    您可以使用条件聚合在单个查询中获取两列:

    SELECT MAX(CASE WHEN maintenanceTs < :dateAsLong THEN odometer END) AS max_odometer,
           MIN(CASE WHEN CAST(strftime('%s', DATE(maintenanceTs / 1000, 'unixepoch')) AS INTEGER) > CAST(strftime('%s', DATE(:dateAsLong / 1000,'unixepoch')) AS INTEGER) THEN odometer END) AS min_odometer
    FROM MaintenanceRecord 
    WHERE vehicleId = :maintenanceVehicleId;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多