24 votos

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

Estoy intentando recorrer un shapefile, seleccionando cada característica a su vez y copiándola en un shapefile temporal para incluirla en un análisis de unión. Estoy utilizando un cursor para encontrar el nombre de identificación de cada característica que estoy estableciendo en una variable 'Nombre'. Cuando intento usar esta variable como parte de la cláusula where en arcpy.Select_analysis obtengo un error:

EjecutarError: ERROR 999999: Error al ejecutar la función. Se ha utilizado una sentencia SQL no válida. Se ha utilizado una sentencia SQL no válida. Error al ejecutar (Select).

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 introducir la variable en la sentencia sql?

22voto

auramo Puntos 161

Una cosa que facilita mucho la redacción de las cláusulas WHERE es utilizar la función AddFieldDelimiters que añade automáticamente los delimitadores correctos específicos del SGBD para los identificadores de campo, como las comillas dobles para FGDB y los corchetes para PGDB.

Otra cosa que hay que tener en cuenta es si el valor es un número, una cadena u otro tipo de dato. En concreto, las cadenas van entre comillas simples, mientras que los números no. Puede comprobar el tipo de campo y añadir comillas simples si se trata de 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)

Véase también la función en esta respuesta para una versión multivalor de la función anterior.

16voto

Darren Puntos 738

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

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

3voto

Roy Puntos 2884

Prueba esto:

Name = 1
study = "StudyID"

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

0voto

Simon Puntos 135

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

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

En función del type(name) puede o no necesitar el ' en torno a %s . Para los números, necesita el ' pero no para texto.

0voto

user149704 Puntos 101

Para mí, esta solución es la que mejor funciona, ya que puedo sustituir tanto una variable al campo de interés como los criterios de valor.

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X