¿Incluyendo una variable en la cláusula where de arcpy.Select_analysis ()?

20

Estoy tratando de recorrer un shapefile, seleccionando cada característica a su vez y copiándola en un shapefile temporal para incluir en un análisis de unión. Estoy usando un cursor para encontrar el nombre de ID para cada función que estoy configurando para un 'Nombre' variable. Cada vez que trato de usar esta variable como parte de la cláusula where en arcpy.Select_analysis me aparece un error:

ExecuteError: ERROR 999999: Error al ejecutar la función. Se utilizó una instrucción SQL no válida. Se utilizó una instrucción SQL no válida. Error al ejecutar (Seleccionar).

El código que estoy usando es:

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

Si lo escribo sin usar las variables:

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

funciona bien

¿Qué debo hacer para encajar la variable en la declaración de SQL?

    
pregunta Flo Harrison 14.06.2012 - 13:45

5 respuestas

14

Otra forma, quizás más simple, es:

where = '"StudyID" = ' + "'%s'" %Name
    
respondido por el Marcin 14.06.2012 - 14:51
20

Una cosa que facilita mucho la escritura de las cláusulas WHERE es utilizar % La función AddFieldDelimiters , que agrega automáticamente los delimitadores específicos de DBMS correctos para los identificadores de campo, como comillas dobles para FGDB y corchetes para PGDB.

La otra cosa que debe considerar es si el valor es un número, una cadena u otro tipo de datos. Específicamente, las cadenas están envueltas en comillas simples, mientras que los números no. Puede verificar el tipo de campo y agregar comillas simples si es un campo de cadena.

Por ejemplo:

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)

Consulte también la función en esta respuesta para una versión de múltiples valores de la función anterior.

    
respondido por el blah238 14.06.2012 - 15:46
3

Prueba esto:

Name = 1
study = "StudyID"

where = '"' + study + '" = ' + "'" + str(Name) + "'"
    
respondido por el Roy 14.06.2012 - 14:40
0

Me gusta usar comillas triples. Creo que son los más fáciles de leer. Por ejemplo,

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

Dependiendo del type(name) puede o no necesitar el ' alrededor de %s . Para los números, necesita el ' pero no para el texto.

    
respondido por el gisdude 29.11.2016 - 21:33
0

Para mí, esta solución funciona mejor, ya que puedo sustituir una variable en el campo de interés y los criterios de valor.

field = "Sport"
value = "Basketball"
where = """"{}" = '{}'""".format(field,value)
    
respondido por el dwiz 09.11.2018 - 16:31

Lea otras preguntas en las etiquetas