arcpy.Select_analysis()のwhere句に変数を含めますか?


21

シェープファイルをループして、各機能を順番に選択し、それを一時的なシェープファイルにコピーして、ユニオン分析に含めようとしています。カーソルを使用して、可変の「名前」に設定している各機能のID名を見つけています。この変数をarcpy.Select_analysisのwhere句の一部として使用しようとすると、エラーが発生します。

ExecuteError:ERROR 999999:関数の実行エラー。無効なSQLステートメントが使用されました。無効なSQLステートメントが使用されました。実行に失敗しました(選択)。

私が使用しているコードは次のとおりです。

Name = 101
where = "\'\"StudyID\" = \\'"+str(Name)+"\\'\'"
arcpy.Select_analysis("C:\\input.shp", "C:\\output.shp", where)

変数を使用せずに入力した場合:

arcpy.Select_analysis("C:\\input.shp", "C:\\output.shp", '"StudyID" = \'101\'')

それはうまくいきます

変数をsqlステートメントに合わせるために何をする必要がありますか?

回答:


14

別の、おそらくもっと簡単な方法は:

where = '"StudyID" = ' + "'%s'" %Name

2
「ArcGIS 10(または、おそらくそれ以降)を使用する場合、フィールド名を引用符で囲む必要はありません」これは誤りです。フィールド区切り文字は、基礎となるDBMSの構文規則に従って指定する必要があります。私の答えをご覧ください。
blah238

上記のコメントは、この回答の正しさのためにロールバックした匿名の編集に対する応答でした。
blah238

Nameユーザー入力に起因する場合、これはSQLインジェクションの脆弱性ではありませんか?
jpmc26

22

WHERE句の記述を簡単にする1つのことAddFieldDelimitersは、FGDBの二重引用符やPGDBの括弧など、フィールド識別子のDBMS固有の正しい区切り文字を自動的に追加する関数を使用することです。

他に考慮しなければならないのは、値が数値、文字列、またはその他のデータ型であるかどうかです。具体的には、文字列は一重引用符で囲まれますが、数字は囲まれません。フィールドタイプを確認し、文字列フィールドの場合は一重引用符を追加できます。

例えば:

import arcpy

def buildWhereClause(table, field, value):
    """Constructs a SQL WHERE clause to select rows having the specified value
    within a given field and table."""

    # Add DBMS-specific field delimiters
    fieldDelimited = arcpy.AddFieldDelimiters(table, field)

    # Determine field type
    fieldType = arcpy.ListFields(table, field)[0].type

    # Add single-quotes for string field values
    if str(fieldType) == 'String':
        value = "'%s'" % value

    # Format WHERE clause
    whereClause = "%s = %s" % (fieldDelimited, value)
    return whereClause

if __name__ == "__main__":
    inputfc = r"C:\input.shp"
    outputfc = r"C:\output.shp"
    fieldname = "StudyID"
    fieldvalue = 101
    whereclause = buildWhereClause(inputfc, fieldname, fieldvalue)
    arcpy.Select_analysis(inputfc, outputfc, whereclause)

上記の関数の複数値バージョンについては、この回答の関数も参照してください。


2
いい案。この関数をarcpyヘルパー関数モジュールに追加したので、arcpy.buildWhereClause
blord-castillo

3

これを試して:

Name = 1
study = "StudyID"

where = '"' + study + '" = ' + "'" + str(Name) + "'"

0

三重引用符を使用するのが好きです。読みやすいと思います。例えば、

name = 101
where = """ "StudyID" = '%s' """ % name
arcpy.Select_analysis("C:\\input.shp", "C:\\output.shp", where)

応じて、type(name)あなたは、または必要としない場合があり'周りを%s。数字の場合は必要ですが、'テキストの場合は必要ありません。


0

私にとって、このソリューションは、対象フィールドの値と値の基準の両方を変数に置き換えることができるため、最適に機能します。

field = "Sport"
value = "Basketball"
where = """"{}" = '{}'""".format(field,value)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.