10 votos

¿Consulta del carácter de subrayado en ArcMap?

Para una consulta LIKE estándar contra una clase de característica de ArcSDE basada en Oracle, el carácter de subrayado representa un comodín de un solo carácter cuando se utiliza con una cadena.

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

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

Respuesta de MDHald funciona para las geodatabases de archivos pero mi caso es específico de Oracle. Asumí erróneamente que la consulta de ArcSDE y de la geodatabase de archivos funcionaría igual para este caso.

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 diferentes

8voto

Kent Dorador Puntos 1

He conseguido encontrar la respuesta.

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

MI_CAMPO COMO '____ _%' 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 [NOT] LIKE y [ESCAPE 'escape-character']

Utilice el operador LIKE (en lugar del operador =) con comodines para construir una búsqueda parcial de cadenas. El símbolo de porcentaje (%) significa que cualquier cosa es aceptable en su lugar: un carácter, cien caracteres, o ningún carácter. Como alternativa, si desea buscar con un comodín que represente un carácter, utilice un guión bajo (_). Si necesita acceder a datos sin caracteres, utilice la función CAST. En ejemplo, esta consulta devuelve los números que empiezan por 8 del campo entero entero SCORE_INT:

CAST ("SCORE_INT" AS VARCHAR) LIKE '8%'

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

"CANTIDAD" COMO '%10 '

3voto

Luke Bibby Puntos 62

Deberá emplear CHAR_LENGTH y SUBSTRING para que esto funcione. Tendría el siguiente aspecto:

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. Cópielo tal cual y sustituya sólo el texto yourfieldname.

0 votos

Tu respuesta funciona para las geodatabases de archivos, pero no me había dado cuenta de que el DBMS subyacente sería tan quisquilloso. A Oracle no le gusta la consulta.

0 votos

Oracle se pone un poco difícil con [DATABASE]..[TABLENAME] requiere esos puntos dobles. Si la consulta no funciona como una definición, siempre se puede crear una vista (clic derecho en su base de datos>seleccionar Nuevo>seleccionar Vista>) en su SDE (suponiendo que tiene una configuración si está tirando de Oracle) y luego escribir una consulta similar.

3voto

UnkwnTech Puntos 21942

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 '%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 :-)
>>>

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