¿Está buscando caracteres de subrayado en ArcMap?

10

Para una consulta LIKE estándar contra una clase de entidad ArcSDE basada en Oracle, el carácter de subrayado representa un comodín de carácter único cuando se usa con una cadena.

Estoy tratando de imponer una consulta de definición para encontrar una cadena de texto que comience con 4 dígitos seguidos exactamente por un carácter de subrayado.

¿Alguien sabe cómo especificaría un carácter de subrayado en una consulta o si / cuál podría ser el carácter de escape?

La respuesta de MDHald funciona para geodatabases de archivos, pero mi caso es específico de Oracle. Asumió falsamente que ArcSDE y la consulta de geodatabase de archivos funcionarían igual para este caso.

Eok
fuente
El carácter de escape suele ser una barra invertida \ ; creo que este también es el caso con Oracle, por lo que querrá buscar \_si busca el guión bajo.
Midavalo
@Midavalo, eso fue lo primero que me vino a la mente. Mi consulta fue CABLE = '_____ \ _%', que arrojó cero resultados.
Eok
es posible que necesite usar LIKE(aunque mencione LIKE en su pregunta) - CABLE LIKE '____\_%'.
Jugaré
1
Prueba CABLE LIKE '____\_%' ESCAPE '\': desde la referencia SQL para las expresiones de consulta utilizadas en ArcGIS - Desktop Help
Midavalo
1
@Midavalo, encontró exactamente lo mismo después de que lo hiciste
Eok

Respuestas:

7

Lograron rastrear la respuesta.

Puede especificar un carácter ESCAPE en la consulta, como:

MY_FIELD LIKE '____ $ _%' ESCAPE '$'

Esto buscará exactamente 4 caracteres seguidos de un carácter de subrayado más cualquier otra cosa después de eso.

Encontré la documentación en esta página: http://desktop.arcgis.com/en/arcmap/10.3/map/working-with-layers/sql-reference-for-query-expressions-used-in-arcgis.htm

No estoy seguro de cuánto tiempo atrás o para qué versiones es válido, pero funciona para ArcGIS Desktop 10.3.

Extracto de la documentación:

x [NO] ME GUSTA y [ESCAPE 'escape-character']

Use el operador LIKE (en lugar del operador =) con comodines para crear una búsqueda de cadena parcial. El símbolo de porcentaje (%) significa que cualquier cosa es aceptable en su lugar: un carácter, cien caracteres o ningún carácter. Alternativamente, si desea buscar con un comodín que represente un carácter, use un guión bajo (_). Si necesita acceder a datos que no sean de caracteres, use la función CAST. Por ejemplo, esta consulta devuelve números que comienzan con 8 del campo entero SCORE_INT:

CAST ("SCORE_INT" COMO VARCHAR) COMO '8%'

Para incluir el símbolo de porcentaje o el guión bajo en la cadena de búsqueda, use la palabra clave ESCAPE para designar otro carácter como el carácter de escape, lo que a su vez indica que sigue inmediatamente un signo de porcentaje real o un guión bajo. Por ejemplo, esta expresión devuelve cualquier cadena que contenga 10%, como 10% DESCUENTO o A10%:

"CANTIDAD" COMO '% 10 $ %%' ESCAPE '$'

Eok
fuente
3

Deberá emplear CHAR_LENGTH y SUBSTRING para que esto funcione. Se vería de la siguiente manera:

CHAR_LENGTH ("yourfieldname") =5 AND SUBSTRING("yourfieldname", 1, 4) <> '_'

donde yourfieldname = el nombre de su campo.

Sin embargo, no elimine el "" en el código. Copie tal cual y reemplace solo el texto yourfieldname.

MDHald
fuente
Su respuesta funciona para las geodatabases de archivos, pero no me di cuenta de que el DBMS subyacente sería tan exigente. A Oracle no le gusta la consulta.
Eok
Oracle se vuelve un poco complicado con [BASE DE DATOS] .. [TABLENAME] requiere esos puntos dobles. Si la consulta no funciona como una definición, siempre puede crear una vista (haga clic con el botón derecho en su base de datos> seleccione Nuevo> seleccione Ver>) en su SDE (suponiendo que tenga una configuración si está sacando de Oracle) y luego escriba Una consulta similar.
MDHald
3

Encontré estas preguntas y respuestas que me ayudaron a resolver por qué no pude usar una cláusula where en un cursor de búsqueda ArcPy que podía restringir el cursor a solo aquellos registros que contenían un guión bajo ( _) en un campo de texto en particular.

Cuando lo descubrí, ya había desarrollado un fragmento de código para ilustrar el problema, así que, en lugar de desperdiciar ese esfuerzo, le agregué la solución y ahora 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 for 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 :-)")

El resultado es:

>>> 
Using where_clause of testField LIKE '%C%' to limit search cursor to print any values containing the letter C:
ABCD
A_CD
This is the expected result :-)

Using where_clause of testField LIKE '%_%' to limit search cursor to print any values containing an underscore (_):
ABCD
A_CD
XYZ
X_Z
This is not what I was hoping for :-(

Using where_clause of testField LIKE '%$_%' ESCAPE '$' to limit search cursor to print any values containing an underscore (_):
A_CD
X_Z
This is what I was hoping for :-)
>>> 
PolyGeo
fuente
1
Gracias por eso ... pierda tanto tiempo en soluciones y sintaxis de caracteres "especiales" ... espero poder recordar dónde encontrarlo la próxima vez que aparezca.
Mike