Abfrage nach Unterstrichen in ArcMap?


10

Bei einer Standard-LIKE-Abfrage für eine Oracle-basierte ArcSDE-Feature-Class repräsentiert der Unterstrich einen Platzhalter für ein einzelnes Zeichen, wenn er mit einer Zeichenfolge verwendet wird.

Ich versuche, eine Definitionsabfrage zu erstellen, um eine Textzeichenfolge zu finden, die mit 4 Ziffern beginnt, gefolgt von einem Unterstrich.

Weiß jemand, wie ich ein Unterstrichzeichen selbst in einer Abfrage angeben würde oder ob / was das Escapezeichen sein könnte?

Die Antwort von MDHald funktioniert für Datei-Geodatabases, aber mein Fall ist spezifisch für Oracle. Es wurde fälschlicherweise angenommen, dass die ArcSDE- und die Datei-Geodatabase-Abfrage in diesem Fall gleich funktionieren würden.


Escape-Zeichen sind normalerweise ein Backslash. \ Ich glaube, dass dies auch bei Oracle der Fall ist. \_Wenn Sie nach dem Unterstrich suchen, sollten Sie danach suchen .
Midavalo

@ Midavalo, das war das erste, was mir in den Sinn kam. Meine Abfrage war CABLE = '_____ \ _%', was keine Ergebnisse ergab.
Eok

Sie müssen möglicherweise verwenden LIKE(obwohl Sie LIKE in Ihrer Frage erwähnen) - CABLE LIKE '____\_%'. Ich werde hier spielen, obwohl ich SQL Server anstelle von Oracle verwende, sodass möglicherweise andere Ergebnisse erzielt werden
Midavalo

1

1
@ Midavalo, fand genau das gleiche direkt nach Ihnen
Eok

Antworten:


7

Hat es geschafft, die Antwort aufzuspüren.

Sie können ein ESCAPE-Zeichen in der Abfrage angeben, z.

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

Dies sucht nach genau 4 Zeichen, gefolgt von einem Unterstrich und allem anderen danach.

Die Dokumentation finden Sie auf dieser Seite: http://desktop.arcgis.com/de/arcmap/10.3/map/working-with-layers/sql-reference-for-query-expressions-used-in-arcgis.htm

Sie sind sich nicht sicher, wie weit zurück oder für welche Versionen dies gültig ist, aber es funktioniert für ArcGIS Desktop 10.3.

Auszug aus der Dokumentation:

x [NICHT] WIE y [ESCAPE 'Escape-Charakter']

Verwenden Sie den Operator LIKE (anstelle des Operators =) mit Platzhaltern, um eine teilweise Zeichenfolgensuche zu erstellen. Das Prozentzeichen (%) bedeutet, dass an seiner Stelle alles akzeptabel ist: ein Zeichen, hundert Zeichen oder kein Zeichen. Wenn Sie alternativ mit einem Platzhalter suchen möchten, der ein Zeichen darstellt, verwenden Sie alternativ einen Unterstrich (_). Wenn Sie auf Nicht-Zeichendaten zugreifen müssen, verwenden Sie die CAST-Funktion. Diese Abfrage gibt beispielsweise Zahlen zurück, die mit 8 aus dem Ganzzahlfeld SCORE_INT beginnen:

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

Um das Prozentzeichen oder den Unterstrich in Ihre Suchzeichenfolge aufzunehmen, verwenden Sie das Schlüsselwort ESCAPE, um ein anderes Zeichen als Escapezeichen zu kennzeichnen. Dies zeigt wiederum an, dass unmittelbar ein echtes Prozentzeichen oder ein Unterstrich folgt. Dieser Ausdruck gibt beispielsweise eine Zeichenfolge zurück, die 10% enthält, z. B. 10% DISCOUNT oder A10%:

"AMOUNT" LIKE '% 10 $ %%' ESCAPE '$'


3

Sie müssen CHAR_LENGTH und SUBSTRING verwenden, damit dies funktioniert. Es würde wie folgt aussehen:

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

Dabei ist Ihr Feldname = der Name Ihres Feldes.

Löschen Sie jedoch nicht das "" im Code. Kopieren Sie wie es ist und ersetzen Sie nur den Text Ihres Feldnamens.


Ihre Antwort funktioniert für Datei-Geodatabases, aber ich wusste nicht, dass das zugrunde liegende DBMS so wählerisch sein würde. Oracle mag die Abfrage nicht.
Eok

Oracle wird mit [DATABASE] etwas knifflig. [TABLENAME] erfordert diese doppelten Punkte. Wenn die Abfrage nicht als Definition funktioniert, können Sie jederzeit eine Ansicht in Ihrer SDE erstellen (Rechtsklick in Ihre Datenbank> Neu auswählen> Ansicht auswählen>) (vorausgesetzt, Sie haben ein Setup, wenn Sie von Oracle abrufen) und dann ausschreiben eine ähnliche Abfrage.
MDHald

3

Ich bin auf diese Fragen und Antworten gestoßen, die mir geholfen haben, herauszufinden, warum ich keine where-Klausel für einen ArcPy-Suchcursor verwenden konnte, die den Cursor nur auf die Datensätze beschränken konnte, die einen Unterstrich ( _) in einem bestimmten Textfeld enthielten .

Als ich es fand, hatte ich bereits ein Code-Snippet entwickelt, um das Problem zu veranschaulichen. Anstatt diesen Aufwand zu verschwenden, habe ich die Lösung hinzugefügt und veröffentliche sie jetzt hier, um möglicherweise einem zukünftigen Besucher mit demselben Problem zu helfen.

Der Test verwendet eine Datei-Geodatabase und wurde unter ArcGIS 10.2.2 für Desktop ausgeführt.

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

Die Ausgabe ist:

>>> 
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
Vielen Dank dafür ... verschwenden Sie so viel Zeit mit "speziellen" Problemumgehungen und Syntax für Zeichen ... hoffentlich erinnere ich mich, wo ich es beim nächsten Mal finden kann.
Mike
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.