【问题标题】:Python and SQLite3: Query must return 2 listsPython 和 SQLite3:查询必须返回 2 个列表
【发布时间】:2013-10-03 10:20:33
【问题描述】:

我正在使用此查询来验证给定路线上是否有 2 个航点(x[0] 和 x[2]):

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

如果两个航路点都在路线上,结果应该类似于[('001', 'A123', 'WAYPOINT X'), ('005', 'A123', 'WAYPOINT Y')]

如果航点/路线组合为假,则返回 None 或一个列表。

检查查询结果是否为双列表(或不是)的最pythonic方法是什么?

【问题讨论】:

  • 检查长度是否等于2?

标签: python list python-3.x sqlite


【解决方案1】:

也许最简单的方法是稍微修改您的 SQL 查询(应用 LIMIT 3 来减轻查询,然后检查您是否只有 2 个):

results = list(c.execute("SELECT WPNumber, ROUTE, WPID FROM wpnavrte WHERE ROUTE = ? AND (WPID = ? OR WPID = ?) LIMIT 3", (x[1], x[0], x[2])))
if len(results) != 2:
    # do something

【讨论】:

    【解决方案2】:
    c.execute("""SELECT t1.WPNumber, t1.ROUTE, t1.WPID, t2.WPID
        FROM wpnavrte t1
        JOIN wpnavrte t2
        ON t1.ROUTE = t2.ROUTE
        WHERE t1.ROUTE = ? AND t1.WPID = ? AND t2.WPID = ?
        """, (x[1], x[0], x[2]))
    

    如果两个航路点在同一条路线上,则c.fetchone() 将返回一个 4 元组,其值代表 WPNumber、Route、第一个和第二个 WPID。

    如果两个航路点不在同一条路线上,c.fetchone() 将返回None

    【讨论】:

    • 有趣...取决于数据库是否可以优化连接...我认为只是限制查询结果,因为它是一个简单的 WHERE 可能更好...
    • @JonClements:是的,你的方法要快得多:)。使用(WPID = ? OR WPID = ?) 的潜在问题是WPID 不是唯一的。在这种情况下,即使只有一个 WPID 匹配,您也可能会返回两条记录。鉴于列的 names,在这种情况下这似乎不太可能,但这只是一个假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2013-11-08
    • 2019-12-02
    • 1970-01-01
    • 2020-12-12
    • 2022-01-01
    相关资源
    最近更新 更多