0

我有一个 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 的输入为空,如何忽略列。

4

1 回答 1

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 的查询。

于 2013-10-11T04:04:38.990 回答