sqlite和python过滤结果

时间:2013-10-11 03:59:00

标签: python sqlite

我有一个python函数来从sqlite进行查询。如下:

def Query(X, Y, Z):

其中X,Y& Z是数据库的列。 所以例如

Query(1, 2, 3)

它会转到sqlite,如下所示:

<code>SELECT OUTPUT FROM IMAGES WHERE (X=?) AND (Y=?) AND (Z=?)",[X,Y,Y]</code>

所以,需要数字1,2和3并将从sqlite中获取它们。 输入时我遇到的问题:

Query(X, Y, Z)

有一个或多个空字段,例如:

Query(1, 2, '')

在这种情况下,我希望数据库忽略列Z,但我无法弄清楚如何做到这一点。 我试过了

SELECT OUTPUT FROM IMAGES WHERE (X=? OR X) AND (Y=? OR Y) AND (Z=? OR Z)",[X,Y,Z]

但这句话效果不佳。

有人可以提供帮助,如果Python的输入为空,如何忽略列。

1 个答案:

答案 0 :(得分:0)

测试空字符串可能有问题。您可以尝试类似以下内容:

"SELECT OUTPUT FROM IMAGES WHERE (X=? OR ?='') AND (Y=? OR ?='') AND (Z=? OR ?='')",[X,Y,Z]

但不可否认,这更像是一种暗示而不是实际验证的解决方案。

修改

您可能需要命名参数:

def Query(X, Y, Z):
    import sqlite3
    conn = sqlite3.connect('example.db')
    c = conn.cursor()
    c.execute("SELECT OUTPUT FROM IMAGES WHERE (X=:px OR :px='') AND (Y=:py OR :py='') AND (Z=:pz OR :pz='')", {"px": X, "py": Y, "pz": Z})

修改

试试这个sqlfiddle

修改

考虑以下查询片段:

(Y=? OR Y)

对于Y ='foo'的数据库行,它等同于:

('foo'=? OR 'foo')

由于'foo'转换为false,这相当于:

('foo'=? OR false)

相当于:

('foo'=?)

只有在查询Y ='foo'时才会出现这种情况。相反,如果您查询Y ='',则得到:

('foo'='')

这显然是错误的。

因此,您的查询实际上就像原始查询一样,没有OR。