2016-03-23 19 views
1

私はPython2.7をWindows 7で使用し、mysqlサーバはpymssqlで接続します。SQLクエリに文字列のリストを与える[Python]

私の問題:私は非常に大きなデータベースを持っていて、リストからいくつかの単語(文字列)に一致するオブジェクトのIDを選択したいのですが、私は自分のプログラムに与えます。 このクエリには、私のリストのこれらの単語についてもLIKE%...%の式が必要です。

今まで私のPython-Scriptをデータベースに接続し、カーソルを定義しました。 は、それから私は私が探しています、言葉で小さなリストを作り、私は後で私のクエリのためのいくつかのプレースホルダを作成しました:

query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
     WHERE BO_BEMERKUNG IN ({})""".format(placeholders) 

私が探しています:

ここ
wortliste = ['Bruch', 'Verwerfung'] 
placeholders = ','.join(['%s'] * len(wortliste)) 

は私のクエリです単一の単語は、ここでの単語「ブルッフ」の例えば、私のクエリは次のようになります。

query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
     WHERE BO_BEMERKUNG LIKE '%Bruch%'""" 

つの単語のためのこのクエリは、右イドの(= BO_INDEX)と一致します。 プレースホルダのクエリがクラッシュすることはありませんが、何も一致しませんでした:(

しかし、私はデータベースをいくつかの単語だけループして、リスト内のすべての単語(文字列) (= wortliste)と、新しいリストに追加します。

私は本当にdont'tこの問題を解決する方法を知っている!

私はこの課題を解決するために、すべての新しい方法のために感謝しています! ありがとう!

答えて

0

編集2:

あなたは(あなたの例を使用して)あなたのリストをループにしたいと出力に追加した場合:

words = ['ab', 'cd', 'ef'] 
abfrage_list = [] 
for w in words: 
    # Generate a query 
    query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
     WHERE BO_BEMERKUNG LIKE '%%%s%%' """ % w 
    # Execute that query and get results 
    cur.execute(query) 
    result_all = cur.fetchall() 
    # Add those results to your final list 
    for i in result_all: 
     abfrage_list.append(i) 

EDIT:

query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
    WHERE BO_BEMERKUNG LIKE '%ab%' 
    OR O_BEMERKUNG LIKE '%cd%' 
    OR O_BEMERKUNG LIKE '%ef%' """ 

query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
    WHERE {params}""".format(
     params=" OR ".join("BO_BEMERKUNG LIKE '%%%s%%' \n" % w for w in wortliste) 
    ) 
print(query) 
:複数like sのご例えば

プリント:

SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
    WHERE BO_BEMERKUNG LIKE '%Bruch%' 
OR BO_BEMERKUNG LIKE '%Verwerfung%' 
あなたの単語リストから項目のいずれかが含まれていませんの

あなたのプレースホルダは、使用:

placeholders = ','.join("'%s'" % w for w in wortliste) 

例えば:

wortliste = ['Bruch', 'Verwerfung'] 
print(','.join(['%s'] * len(wortliste))) 
print(','.join("'%s'" % w for w in wortliste)) 

プリント:

%s,%s 
'Bruch','Verwerfung' 
+0

はい、これは正しいです! – Hardinger

+0

しかし、私のクエリはまだ何も一致しません、私はLIKE '%...%' - 式を含める必要がありますが、私はこの例のための方法を知らない。 – Hardinger

+0

作成するクエリを知っていますか?それを質問に追加できますか?たぶん、あなたはこれを使用したいと思います:http://stackoverflow.com/questions/12957993/how-to-use-sql-like-condition-with-multiple-values-in-postgresql – Bahrom

0

の例のために次のリスト= ['ab'、 'cd'、 'ef']

query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
    WHERE BO_BEMERKUNG LIKE '%ab%' 
    OR O_BEMERKUNG LIKE '%cd%' 
    OR O_BEMERKUNG LIKE '%ef%' """ 

cur.execute(query) 
result_all = cur.fetchall() 

abfrage_list = [] 
for i in result_all: 
    abfrage_list.append(i) 

しかし、私はこのリストの何百もの文字列に対してこの手順が必要です。 私はこのリストをループする必要があり、私はクエリでLIKE式が必要です。そうしないと何も捕らえません。

+0

私の編集した答えを見てください – Bahrom

関連する問題