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

使用了无效的SQL语句。
使用了无效的SQL语句。
执行(选择)失败。

我正在使用的代码是:

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


如果我不使用变量就输入它:使变量适合sql语句?

#1 楼

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

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


评论


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

–blah238
13年2月12日在17:39



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

–blah238
13年2月12日在18:18



如果“名称”来自用户输入,这不是SQL注入漏洞吗?

– jpmc26
17年2月4日1:00



#2 楼

使编写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)


另请参见此函数回答上述功能的多值版本。

评论


好点子。我将此函数添加到我的arcpy辅助函数模块中,因此它被定义为arcpy.buildWhereClause

– Blord-castillo
13-10-15在17:01

#3 楼

试试这个:

Name = 1
study = "StudyID"

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


#4 楼

我喜欢使用三重引号。我认为它们是最容易阅读的。例如,

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


取决于type(name),您可能需要'周围的%s,也可能不需要。对于数字,您确实需要',但对于文本则不需要。

#5 楼

对我来说,此解决方案效果最佳,因为我可以将变量替换为关注领域和价值标准。

field = "Sport"
value = "Basketball"
where = """"{}" = '{}'""".format(field,value)