2

アクセス テーブルのフィールド内のアイテムをカーソル検索しようとしています。次に、それらを「distList」というリストに追加します。リストを式の SQL クエリビルダー 'WHERE' 句に渡したい:

"Field1" in distList

または長い手で言えば、次のようになります。

"Field1" in ('ds(c1)', 'ds(b1)', 'ds(c2)', 'ds(g1)')

リストは次のようになります。

['ds(c1)', 'ds(b1)', 'ds(c2)', 'ds(g1)']

私が抱えている問題は、上記の SQL 式が Python リストの「中」に表示されたくないということです。角括弧を認識しません。丸括弧を好むので、タプルを使用することを考えました。私が直面している問題は、カーソルがアクセス テーブルから項目を検索した後にタプルを作成する方法がわからないことです。ここに私のコード例があります:

distList = []
for lyr in arcpy.mapping.ListLayers(mxd, "", df):
    if lyr.name == "Disturbance":
           for row in arcpy.SearchCursor(lyr):
                if "ds" in row.Field1:
                     distList.append(row.Field1)
    lyr.definitionQuery = '"Field1"' + "in " + distList

私のリストをタプルにする方法、または私のアイテムを角かっこの代わりに丸かっこを持つ形式にするためのより良い方法を誰かが提案できますか?

回避策として、リストを文字列に変換してからstr(distList)括弧を置き換えてみました。それはうまくいきますが、面倒なようで、もっと良い方法があると確信しています。

ありがとう、マイク

4

3 に答える 3

1

リストを前処理します。

distList = ['ds(c1)', 'ds(b1)', 'ds(c2)', 'ds(g1)']
refinedList = ','.join(a for a in distList)

次のように、WHERE句でSQLの洗練されたリストを渡します。

SQL_QUERY = """
select *
from abc
where someCol = ({0})

"""

SQL = SQL_QUERY.format(refinedList)

ここの {0} はパラメーター (refinedList) です。String format() 関数をよりよく理解するには、pythonDocs を参照してください。クエリを実行すると、実行されます。

于 2012-08-22T21:47:01.933 に答える
1

試しましたか:

str(tuple(distList))

編集:

上記は、複数のアイテムを持つリストに対してのみ機能します。

Arun の答えに似たものは、1 つ以上のアイテムで機能するという点で、より一般的です。

distlist = '({})'.format(','.join(elem for elem in distlist))

ただし、クエリと RDBMS によっては、事前に 1 つの項目をチェックし、その場合は等価演算子のみを使用する方が効率的な場合があります。

于 2012-08-22T20:53:42.893 に答える
0

別のサイトから回答がありましたので、転載させていただきます。次のスクリプトは、クエリを文字列に変更し、私の definitionQuery に受け入れられます。付加価値を得るために、リストを「設定」して重複を排除します。

if "ds" in row.Field1:
            distList.append('"{}"'.format(row.Field1))
    lyr.definitionQuery = '"Field1" in ({})'.format(", ".join(set(distList)))
于 2012-08-22T21:39:47.843 に答える