在arcpy.Select_analysis()的where子句中包含变量?


21

我试图遍历一个shapefile,依次选择每个特征并将其复制到一个临时shapefile中,并包含在并集分析中。我正在使用光标查找要设置为变量“名称”的每个功能的ID名称。每当我尝试将此变量用作arcpy.Select_analysis中where子句的一部分时,都会出现错误:

ExecuteError:错误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语句?

Answers:


14

另一种可能更简单的方法是:

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

2
“在使用ArcGIS 10(或者可能以后)时,不需要用引号引起来”。必须根据基础DBMS的语法规则指定字段定界符。看我的答案。
blah238

上面的评论是对匿名编辑的回应,我为确保此答案的正确性而回滚。
blah238 2013年

如果Name来自用户输入,这不是SQL注入漏洞吗?
jpmc26

22

使该WHERE子句的编写变得容易得多的一件事是使用该AddFieldDelimiters函数,该函数会自动为字段标识符添加正确的,DBMS特定的分隔符,例如FGDB的双引号和PGDB的括号。

您还需要考虑的另一件事是该值是数字,字符串还是其他数据类型。具体来说,字符串用单引号引起来,而数字则没有。您可以检查字段类型并添加单引号(如果它是字符串字段)。

例如:

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.