2016-05-02 74 views
0

我有一個值列表(單詞),我想檢查列表中是否有一列包含一個值(任何值)。Where字段中的多個詞LIKE

我的列表可能會很長,所以我想用一個for循環來創建它,例如:

words = ('one', 'two', 'three') 
whereClause="" 
a="" 
for word in words: 
    temp=" item LIKE '%" +word + " %' or" 
    whereClause=whereClause+temp 
whereClause = whereClause[17:] #delete first "item LIKE" 
whereClause = whereClause[:-3] #delete last "or" 

現在我希望把它放在我的SQL查詢:

sql= """select name 
from table 
where item LIKE ? """ 

cursor.execute(sql, whereClause) 
rows=cursor.fetchall() 

這是不工作,有什麼建議?

你覺得我最好列「名稱」使用sql查詢的所有值,然後才檢查是否從列表中值存在使用Python的? 謝謝!

+0

你的問題是,當你刪除喜歡你的第一個項目。簡化的東西,並在你的SQL變量,把它作爲'在哪裏?'並且不要刪除像 –

+0

這樣的第一個項目請避免以這種方式構建您的'where'子句,因爲它會使您暴露於'SQL注入'攻擊。你最好的選擇就是像'單詞'中的元素數量一樣構造許多'OR item LIKE'迭代。然後在執行時將整個'words'數組作爲sqlParameter傳入。 – Stavr00

+0

謝謝@ Stavr00,但我不確定我是否理解你的想法。你能解釋一下嗎? – user5435739

回答

0

如果你仍然有問題:

words = ('one', 'two', 'three') 
whereClause="" 

i = 1 
for word in words: 
    if i == 1: 
     whereClause = " item LIKE '%" +word + "%'" 
    else: 
     whereClause += " OR item LIKE '%" +word + "%'" 
    i += 1 

sql= """select name 
from table 
where {0} """.format(whereClause) 

cursor.execute(sql) 
rows=cursor.fetchall() 
0

不是很流利的Python,但這裏有雲:

for word in words: 
    whereClause += " OR" if whereClause 
    whereClause += " ITEM LIKE ?" 
sql= "select name from table where" + whereClause 
cursor.execute(sql, words)