SQLite - 使用可变数量的条件过滤结果

时间:2014-03-15 07:28:38

标签: python sql sqlite

我已经玩了几个小时的Python和SQlite(第一次学习)。我想为一些文件创建一个标记数据库,并使用AND / OR操作过滤掉标记。简单的解决方案:

taglist = ['tag1', 'tag2']

rows = c.execute("SELECT DISTINCT * FROM tags WHERE tag=? OR tag=?", [taglist[0], taglist[1]])
for row in rows:
    #do stuff

问题是,这限制了我在SQL查询中放置的许多AND / OR语句的标准(在本例中为两个)。如何输入可变数量的标准,以便用户可以根据自己的喜好选择多少个标签?

编辑:我设法将某些东西放在一起,但它看起来并不优雅。我无法弄清楚如何获得"标签列表"列入SQL查询。它期望一个字符串,而不是一个列表,甚至将列表转换为字符串似乎不起作用。我最终将它连接到SQL查询字符串。

以下是我提出的和可变数量的标签在一起的内容。它首先执行OR子查询以获取具有匹配标记的所有id,然后执行COUNT以过滤出与查询的标记数量相同的次数的COUNT。如果ID小于此值,则不会在标记列表中指定所有标记。

taglist = ('tag1','tag2')
tagstring = str(taglist)
tagcount = len(taglist)

rows = c.execute("SELECT id FROM (SELECT * FROM tags WHERE tag IN " + tagstring + ") GROUP BY id HAVING COUNT(id)=(?)", [tagcount])

这似乎有效,但我无法帮助,但认为有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我不知道python,但是对于它的SQL方面,你会想要查看IN子句。

你需要仔细检查python,这是我可以通过快速搜索语法收集的内容。 (对于SQL语句构建器语法,我只使用了代码中的内容,可能有更简洁的方法)。

taglist = ['tag1', 'tag2']

s = ""
for i in range(len(taglist)):
    s+=str(taglist[i])

rows = c.execute("SELECT DISTINCT * FROM tags WHERE tag IN ( ? )", [s])

for row in rows:
   #do stuff