Encontré esta pregunta y respuesta que me ayudó a resolver por qué no podía utilizar una cláusula where en un cursor de búsqueda de ArcPy que pudiera restringir el cursor a sólo aquellos registros que contenían un guión bajo ( _
) en un campo de texto concreto.
Cuando lo encontré ya había desarrollado un fragmento de código para ilustrar el problema, así que, en lugar de desperdiciar ese esfuerzo, he añadido la solución y lo estoy publicando aquí para quizás ayudar a un futuro visitante con el mismo problema.
La prueba utiliza una geodatabase de archivos y se ejecutó en ArcGIS 10.2.2 para Desktop.
import arcpy
arcpy.CreateFileGDB_management(r"C:\Temp","test.gdb")
arcpy.CreateFeatureclass_management(r"C:\Temp\test.gdb","testFC")
arcpy.AddField_management(r"C:\Temp\test.gdb\testFC","testField","Text")
cursor = arcpy.da.InsertCursor(r"C:\Temp\test.gdb\testFC",["testField"])
cursor.insertRow(["ABCD"])
cursor.insertRow(["A_CD"])
cursor.insertRow(["XYZ"])
cursor.insertRow(["X_Z"])
del cursor
where_clause = "testField LIKE '%C%'"
print("Using where_clause of {0} to limit search cursor to print any values containing the letter C:".format(where_clause))
with arcpy.da.SearchCursor(r"C:\Temp\test.gdb\testFC",["testField"],where_clause) as cursor:
for row in cursor:
print(row[0])
print("This is the expected result :-)")
where_clause = "testField LIKE '%_%'"
print("\nUsing where_clause of {0} to limit search cursor to print any values containing an underscore (_):".format(where_clause))
with arcpy.da.SearchCursor(r"C:\Temp\test.gdb\testFC",["testField"],where_clause) as cursor:
for row in cursor:
print(row[0])
print("This is not what I was hoping for :-(")
where_clause = "testField LIKE '%$_%' ESCAPE '$'"
print("\nUsing where_clause of {0} to limit search cursor to print any values containing an underscore (_):".format(where_clause))
with arcpy.da.SearchCursor(r"C:\Temp\test.gdb\testFC",["testField"],where_clause) as cursor:
for row in cursor:
print(row[0])
print("This is what I was hoping for :-)")
La salida es:
>>>
Using where_clause of testField LIKE
ABCD
A_CD
This is the expected result :-)
Using where_clause of testField LIKE
ABCD
A_CD
XYZ
X_Z
This is not what I was hoping for :-(
Using where_clause of testField LIKE
A_CD
X_Z
This is what I was hoping for :-)
>>>
0 votos
El carácter de escape suele ser una barra invertida
\
- Creo que este es también el caso de Oracle, por lo que querría buscar\_
si se busca el guión bajo.0 votos
@Midavalo, eso fue lo primero que se me ocurrió. Mi consulta era CABLE = '_____ \_ %' , que devolvió cero resultados.
0 votos
Es posible que tenga que utilizar
LIKE
(aunque usted menciona LIKE en su pregunta) -CABLE LIKE '____\_%'
. Voy a jugar aquí, aunque estoy usando SQL Server en lugar de Oracle por lo que puede obtener resultados diferentes1 votos
Prueba con
CABLE LIKE '____\_%' ESCAPE '\'
- de Referencia SQL para las expresiones de consulta utilizadas en ArcGIS - Ayuda de escritorio1 votos
@Midavalo, encontré exactamente lo mismo justo después que tú