怎么写这个查询?

时间:2011-03-21 13:57:05

标签: python sqlite

假设我有一个像这样的sqlite表:

Id|B|C|D

我有一个包含Id值的列表。也许[1,3,45,67](类似的东西。)

我想在列表中获取包含Id的行,其B值大于5,最终按C排序。

我认为我为此提出的标题是可怕的,如果你能想到更好的标题,请编辑它。

4 个答案:

答案 0 :(得分:3)

假设ids_list是你的id列表,tablename就是你的表:

c = sqlite3.connect('foo').cursor()
c.execute("""
select Id, B, C, D
from tablename
where 
    Id in (%s) and 
    B >= 5
order by C
""" % ",".join( str(int(id)) for id in ids_list ))

%s替换是不好的做法,因为受SQL注入。应该使用?,但它似乎不适用于in子句。因此str(int(id))技巧,“清理”(或检查)id值(如果没有有效值将失败)

答案 1 :(得分:3)

相关问题,我将从中窃取Alex Martelli的答案:

Parameter substitution for a SQLite "IN" clause

这是我创建的数据:

sqlite> create table x(a,b,c,d);
sqlite> insert into x values(1, 10, 2, null);
sqlite> insert into x values(2, 10, 3, null); 
sqlite> insert into x values(3, 10, 4, null);

用Python来获取它:

>>> ids = [2, 3]
>>> query = "SELECT b, c, d FROM x WHERE a IN ({0}) AND b > 5 ORDER BY c".format(','.join('?' for i in ids))
>>> query
'SELECT b, c, d FROM x WHERE a IN (?,?) AND b > 5 ORDER BY c'
>>> conn.execute(query, ids).fetchall()
[(10, 3, None), (10, 4, None)] 

答案 2 :(得分:2)

我会使用以下内容:

ids = [1, 3, 45, 67]
cnx = sqlite3.connect('my_database.db')
cursor = cnx.cursor()
cursor.execute("""
    SELECT Id, B, C, D FROM table
    WHERE Id IN (%s) AND B > 5 ORDER BY C
    """ % ','.join('?' * len(ids)), tuple(ids))
results = cursor.fetchall()

答案 3 :(得分:0)

我不知道python和sqlite之间的API,但是这个伪代码应该有帮助:

list_id = [1,3,45,67]
ids = ",".join(["%s" % el for el in list_id])
print 'SELECT * FROM table WHERE B>5 AND ID IN (%s) ORDER BY C DESC' % (ids)