Zapytanie o znak podkreślenia w ArcMap?


10

W przypadku standardowego zapytania LIKE względem klasy funkcji ArcSDE opartej na Oracle znak podkreślenia reprezentuje jednoznaczny znak wieloznaczny, gdy jest używany z łańcuchem.

Próbuję narzucić zapytanie definicji, aby znaleźć ciąg tekstowy, który zaczyna się od 4 cyfr, po których dokładnie następuje znak podkreślenia.

Czy ktoś wie, jak sam określiłbym znak zapytania w zapytaniu lub czy / czym może być znak zmiany znaczenia?

Odpowiedź MDHald działa dla geobaz danych plikowych, ale mój przypadek jest specyficzny dla Oracle. Fałszywie zakładano, że ArcSDE i kwerenda geobazy plików będą działać tak samo w tym przypadku.


Ucieczka jest zwykle odwrotnym ukośnikiem \ - uważam, że tak jest również w przypadku Oracle, więc warto poszukać \_podkreślenia.
Midavalo

@Midavalo, to była pierwsza rzecz, jaka przyszła mi do głowy. Moje zapytanie brzmiało CABLE = „_____ \ _%”, co zwróciło zero wyników.
Eok

możesz potrzebować użyć LIKE(chociaż w swoim pytaniu wspominasz LIKE) - CABLE LIKE '____\_%'. Będę tu grać, chociaż używam SQL Servera zamiast Oracle, więc mogę uzyskać inne wyniki
Midavalo


1
@Midavalo, znalazł dokładnie to samo zaraz po tobie
Eok,

Odpowiedzi:


7

Udało się wyśledzić odpowiedź.

Możesz określić znak ESCAPE w zapytaniu, taki jak:

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

Spowoduje to wyszukanie dokładnie 4 znaków, a następnie znaku podkreślenia i wszystkiego innego po tym.

Znalazłem dokumentację na tej stronie: http://desktop.arcgis.com/en/arcmap/10.3/map/working-with-layers/sql-reference-for-query-expressions-used-in-arcgis.htm

Nie jestem pewien, jak daleko wstecz lub dla jakich wersji jest to ważne, ale działa w ArcGIS Desktop 10.3.

Fragment dokumentacji:

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

Użyj operatora LIKE (zamiast operatora =) z symbolami wieloznacznymi, aby zbudować częściowe wyszukiwanie ciągu. Symbol procentu (%) oznacza, że ​​na jego miejscu można zaakceptować wszystko: jeden znak, sto znaków lub brak znaku. Alternatywnie, jeśli chcesz wyszukiwać za pomocą symbolu wieloznacznego reprezentującego jeden znak, użyj znaku podkreślenia (_). Jeśli chcesz uzyskać dostęp do danych innych niż znaki, użyj funkcji CAST. Na przykład to zapytanie zwraca liczby rozpoczynające się od 8 z pola liczb całkowitych SCORE_INT:

CAST („SCORE_INT” JAKO VARCHAR) JAK „8%”

Aby dołączyć symbol procentowy lub znak podkreślenia do łańcucha wyszukiwania, użyj słowa kluczowego ESCAPE, aby wyznaczyć inny znak jako znak zmiany znaczenia, co z kolei oznacza, że ​​natychmiast następuje prawdziwy znak procentu lub znak podkreślenia. Na przykład to wyrażenie zwraca dowolny ciąg zawierający 10%, taki jak 10% ZNIŻKA lub A10%:

„KWOTA” LUBI ”% 10 $ %%„ ESCAPE ”$


3

Aby to zadziałało, musisz zastosować CHAR_LENGTH i SUBSTRING. Wyglądałoby to następująco:

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

gdzie twoja nazwa pola = nazwa twojego pola.

Nie usuwaj „” w kodzie. Skopiuj jak jest i zamień tylko tekst twoja nazwa pola.


Twoja odpowiedź działa z geobazami plików, ale nie zdawałem sobie sprawy, że bazowy DBMS byłby tak wybredny. Oracle nie lubi zapytania.
Eok

Oracle staje się nieco trudna z [DATABASE] .. [TABLENAME] wymaga tych podwójnych punktów. Jeśli zapytanie nie działa jako definicja, zawsze możesz utworzyć widok (kliknij prawym przyciskiem myszy bazę danych> wybierz Nowy> wybierz Widok>) w swoim SDE (Zakładając, że masz jedną konfigurację, jeśli pobierasz z Oracle), a następnie wypisz podobne zapytanie.
MDHald

3

Natknąłem się na te pytania, które pomogły mi wyjaśnić, dlaczego nie mogłem użyć klauzuli where na kursorze wyszukiwania ArcPy, który mógłby ograniczyć kursor tylko do tych rekordów, które zawierały _znak podkreślenia ( ) w określonym polu tekstowym.

Zanim go znalazłem, opracowałem fragment kodu ilustrujący problem, więc zamiast marnować ten wysiłek, dodałem do niego rozwiązanie i teraz zamieszczam go tutaj, aby być może pomóc przyszłemu gościowi z tym samym problemem.

Test wykorzystuje geobazę plików i został przeprowadzony w ArcGIS 10.2.2 na komputery.

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

Dane wyjściowe to:

>>> 
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
Dzięki za to ... marnuj tyle czasu na "specjalne" obejścia postaci i składnię ... mam nadzieję, że pamiętam, gdzie ją znaleźć następnym razem.
Mike
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.