【问题标题】:SQLite3 order by fieldSQLite3 按字段排序
【发布时间】:2013-10-04 09:27:43
【问题描述】:

我有这个问题:

c.execute("SELECT WPNumber, ROUTE, WPID FROM rte WHERE ROUTE = ? AND (WPID = ? OR WPID = ?) LIMIT 3", (x[1], x[0], x[2])))

查询有效,但我需要它首先返回 WPID = x[0] 的结果。换句话说,如果 x[0] 在表格的下方,它仍然必须作为第一个结果返回。

我已经摆弄了一下,我认为按字段排序就可以了。但是,我的 SQL 知识有限,无法使查询正常工作。我在正确的轨道上吗?查询会是什么样子?

【问题讨论】:

  • 您的意思是 WPID 的 VALUE 与 ResultSet 顶部的 X[0] 相同吗?
  • 是的,WPID = x[0]。无论它在表中的位置如何,它始终必须作为第一个结果返回。

标签: sql sqlite sql-order-by


【解决方案1】:

为了能够使用ORDER BY,您需要将两个 ID 值转换为保证第一个 ID 较小的值。 在一般情况下,CASE expression 可以做到这一点:

c.execute("SELECT WPNumber, ROUTE, WPID" +
          " FROM rte" +
          " WHERE ROUTE = ? AND WPID IN (?, ?)" +
          " ORDER BY CASE WPID WHEN ? THEN 1 ELSE 2 END" +
          " LIMIT 3",
          (x[1], x[0], x[2], x[0]))

【讨论】:

    【解决方案2】:

    你可以试试这个:

    c.execute("SELECT WPNumber, ROUTE, WPID FROM rte WHERE ROUTE = ? AND (WPID = ? OR WPID = ?) ORDER BY " + X[0] + " LIMIT 3 ", (x[1], x[0], x[2])))

    Order by Clause 和 Order sequense 最后 例如

    SELECT WPNumber, ROUTE, WPID FROM rte WHERE ROUTE = "foo" AND (WPID = 11 OR WPID = 22) ORDER BY 11, 22 LIMIT 3

    【讨论】:

    • "SELECT WPNumber, ROUTE, WPID FROM rte WHERE ROUTE = ? AND (WPID = ? OR WPID = ?) LIMIT 3 ORDER BY" + x[0], (x[1], x[ 0], x[2]))) sqlite3.OperationalError: "ORDER" 附近: 语法错误
    • 即使您重新排列了ORDER BY 子句使其位于正确的位置,ORDER BY 中的数字也会被解释为结果集列号。
    • 我不知道您使用的是哪种技术,但您应该按照我在子句中提到的顺序编写查询。
    • ("SELECT WPNumber, ROUTE, WPID FROM rte WHERE ROUTE = ? AND (WPID = ? OR WPID = ?) LIMIT 3 ORDER BY " + x[0], (x[1], x [0], x[2]))) 给我:“sqlite3.OperationalError:没有这样的列:WAYPOINT1”
    • 你能否更新你的查询应该是这样的:你的查询应该是这样的SELECT * FROM rte WHERE ROUTE = "Your ROUTE" AND (WPID = CAST(123 AS INTEGER) OR WPID = CAST(456 AS INTEGER) ) ORDER BY LIMIT 3Limit应该在Order by子句之后
    猜你喜欢
    • 2022-01-25
    • 2012-11-08
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    相关资源
    最近更新 更多