【问题标题】:Python Sqlite - How to select where Column1 OR Column2 are equal to value in List?Python Sqlite - 如何选择 Column1 或 Column2 等于列表中的值的位置?
【发布时间】:2019-10-10 17:47:33
【问题描述】:

我有一个 GUI,用户可以在其中为 Sqlite 查询选择一个或多个过滤器值。

目前我有这个查询:

    sql="SELECT * FROM Product WHERE LatestChanges IS NOT 'Deleted' AND SubCategory IN ({seq})".format(seq=','.join(['?']*len(self.FilterValues)))

现在我想从我的过滤器值中 SubCategory OR Category 等于 1 的产品中进行选择。我怎么做?

我如何防止双重选择?

【问题讨论】:

  • 您只需在 WHERE 子句中添加一个OR 条件。您构建逻辑条件就像在其他所有语言中一样,使用括号对复合条件等进行分组。看起来您已经了解如何构建条件逻辑,所以这看起来相当简单。我错过了一些复杂性吗?
  • 关于“双重选择”的问题需要有关您的架构和数据示例的更多详细信息。否则,只是猜测将复制什么和/或如何防止这种情况。单独的 WHERE 条件不会双重选择任何内容。如果一行匹配 OR 语句的两个条件,那么整个条件就是 TRUE。 SELECT 不会为 WHERE 条件的每个部分返回一行。整个 WHERE 条件要么为真,要么为假,而不是多次为真。当您使用可以重复的 JOIN 或 SELECT 受限字段,但您选择 * 时,会出现双重结果。
  • 我掌握了基础知识,但由于对 SQL 来说相对较新,我有时会有点卡住!感谢您的解释!

标签: python sql python-3.x sqlite


【解决方案1】:

这是您需要匹配现有条件的模式:

x AND (y or z)

没有办法将两个事物与基本条件表达式中的同一个手动值列表进行比较——该列表需要指定两次。因此,如果y 类似于SubCategory IN ({seq}),则z 需要为Category IN ({seq}),以便将列表两次插入到字符串中。使用命名格式参数至少可以让您重用列表字符串,但这是 python 功能而不是 sqlite SQL 功能。


还有另一种 SQL 方法,但它可能仅在列表很长时才有用(即更有效?)。否则,上述方法可能是最简单的方法。

您可以指定由数据的文字列定义的命名 CTE(通用表表达式),然后引用相同的列表。 (为了便于阅读,我将字符串分成单独的行,但它的格式不适合python):

sql="
WITH categoryList AS (
     SELECT * FROM ( VALUES ({seq}))
     )
SELECT * 
FROM Product 
WHERE LatestChanges IS NOT 'Deleted'
    AND (SubCategory IN categoryList OR Category IN categoryList)
".format(seq='),('.join(['?']*len(self.FilterValues)))

请注意,分隔符 '),(' 是创建单列文字值所必需的。否则只有逗号分隔符会被解释为同一行中的多个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2021-01-30
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多