Interrogazione per il carattere di sottolineatura in ArcMap?


10

Per una query LIKE standard su una classe di funzionalità ArcSDE basata su Oracle, il carattere di sottolineatura rappresenta un carattere jolly a singolo carattere se utilizzato con una stringa.

Sto cercando di imporre una query di definizione per trovare una stringa di testo che inizia con 4 cifre esattamente seguite da un carattere di sottolineatura.

Qualcuno sa come vorrei specificare un carattere di sottolineatura stesso in una query o se / quale potrebbe essere il carattere di escape?

La risposta di MDHald funziona con i file geodatabase ma il mio caso è specifico di Oracle. Falsamente suppose che ArcSDE e la query di geodatabase di file funzionassero lo stesso per questo caso.


Il carattere di escape è di solito una barra rovesciata \ - credo che questo sia anche il caso di Oracle, quindi dovresti cercare \_se cerchi il carattere di sottolineatura.
Midavalo

@Midavalo, è stata la prima cosa che mi è venuta in mente. La mia query era CABLE = '_____ \ _%', che ha restituito zero risultati.
Ricevuto il

potresti aver bisogno di usare LIKE(anche se menzioni MI PIACE nella tua domanda) - CABLE LIKE '____\_%'.
Giocherò


1
@Midavalo, ho trovato la stessa identica cosa subito dopo aver fatto
Eok

Risposte:


7

Gestito per rintracciare la risposta.

È possibile specificare un carattere ESCAPE nella query come:

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

Questo cercherà esattamente 4 caratteri seguiti da un carattere di sottolineatura più qualsiasi altra cosa dopo.

Ho trovato la documentazione in questa pagina: http://desktop.arcgis.com/en/arcmap/10.3/map/working-with-layers/sql-reference-for-query-expressions-used-in-arcgis.htm

Non sono sicuro di quanto indietro o per quali versioni questo sia valido ma funziona per ArcGIS Desktop 10.3.

Estratto dalla documentazione:

x [NOT] LIKE y [ESCAPE 'escape-character']

Utilizzare l'operatore LIKE (anziché l'operatore =) con caratteri jolly per creare una ricerca di stringhe parziale. Il simbolo percentuale (%) indica che qualsiasi cosa è accettabile al suo posto: un carattere, un centinaio di caratteri o nessun carattere. In alternativa, se si desidera cercare con un carattere jolly che rappresenta un carattere, utilizzare un trattino basso (_). Se è necessario accedere a dati non di carattere, utilizzare la funzione CAST. Ad esempio, questa query restituisce numeri che iniziano con 8 dal campo intero SCORE_INT:

CAST ("SCORE_INT" COME VARCHAR) COME "8%"

Per includere il simbolo percentuale o il trattino basso nella stringa di ricerca, utilizzare la parola chiave ESCAPE per designare un altro carattere come carattere di escape, che a sua volta indica che un segno di percentuale reale o un trattino basso segue immediatamente. Ad esempio, questa espressione restituisce qualsiasi stringa contenente il 10%, come 10% di SCONTO o A10%:

"IMPORTO" COME '% 10 $ %%' ESCAPE '$'


3

Per poter funzionare, dovrai utilizzare CHAR_LENGTH e SUBSTRING. Sembrerebbe come segue:

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

dove yourfieldname = il nome del tuo campo.

Non eliminare "" nel codice però. Copia così com'è e sostituisci solo il testo nome campo.


La tua risposta funziona per i file geodatabase, ma non mi rendevo conto che il DBMS sottostante sarebbe stato così esigente. Oracle non piace la query.
Ricevuto il

Oracle diventa un po 'complicato con [DATABASE] .. [TABLENAME] richiede quei doppi punti. Se la query non funziona come una definizione, puoi sempre creare una vista (fai clic con il pulsante destro del mouse sul database> seleziona Nuovo> seleziona Visualizza>) nel tuo SDE (supponendo che tu abbia una configurazione se stai estraendo da Oracle) e poi scrivi una query simile.
MDHald,

3

Mi sono imbattuto in queste domande e risposte che mi hanno aiutato a risolvere il motivo per cui non ero in grado di utilizzare una clausola where su un cursore di ricerca ArcPy che poteva limitare il cursore solo ai record che contenevano un carattere di sottolineatura ( _) in un particolare campo di testo.

Quando l'ho scoperto, avevo già sviluppato uno snippet di codice per illustrare il problema, quindi, piuttosto che sprecare tale sforzo, ho aggiunto la soluzione ad esso e ora lo sto pubblicando qui per forse aiutare un futuro visitatore con lo stesso problema.

Il test utilizza un file geodatabase ed è stato eseguito su ArcGIS 10.2.2 per 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 :-)")

L'output è:

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

1
Grazie per quello ... spreco così tanto tempo in soluzioni e sintassi "speciali" per i personaggi ... spero di ricordare dove trovarlo la prossima volta che arriva.
Mike,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.