0

sqlite からクエリを実行する python 関数があります。次のように:

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)

例のように、1 つ以上の空のフィールドがあります。

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 に答える