2013-10-11 76 views
0

我有一個python函數來從sqlite查詢。如下所示:sqlite和python過濾器結果

def Query(X, Y, Z): 

其中X,Y & Z爲數據庫的列。 所以例如當

Query(1, 2, 3) 

它會去源碼如下:

<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的輸入爲空,如何忽略列。

+0

爲什麼不使用if語句來運行不同的查詢?這有點長,但它仍然是一個很好的解決方案。 – aIKid

+0

我可以使用if語句,但我希望將代碼最小化。此外,我嘗試了類似於PHP中的這種說法,並且它工作的很好,所以這是第一個解決方案在我腦海中彈出。 – user2869440

回答

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'=? OR 'foo') 

由於'foo'轉換爲false,這相當於:

('foo'=? OR false) 

即相當於:

('foo'=?) 

這可真只有當你查詢了Y = '富'。如果您改爲詢問Y ='',您會得到:

('foo'='') 

這顯然是錯誤的。

因此,您的查詢確實表現得像原來的那樣,沒有ORs。

+0

當我提供所有輸入時,我做了測試,結果表明它運行良好。並且如果最後的輸入Z沒有提供,它工作正常。但是當X或者Y沒有提供時,它不會獲取任何東西。聽起來怪怪的。 – user2869440

+0

聽起來很奇怪,因爲查詢是對稱的,X,Y和Z應該以相同的方式運行。嘗試播放一下我發佈的sqlfiddle,我認爲你一直非常接近解決方案。在我的情況下(在sqlfiddle上的WebSQL),大多數字符串看起來都被轉換爲false,因此在**或**子句中替換時,不會幫助將括號中的組設爲true。 – damix911

+0

命名的參數工作得很好。謝謝你的聰明的答案。 – user2869440