ArcMap'te alt çizgi karakteri için sorgulama yapılıyor mu?


10

Oracle tabanlı ArcSDE özellik sınıfına karşı standart bir LIKE sorgusu için alt çizgi karakteri, bir dize ile kullanıldığında tek karakterli bir joker karakteri temsil eder.

Ben tam olarak bir alt çizgi karakteri takip 4 basamaklı bir metin dizesi bulmak için bir tanım sorgusu empoze etmeye çalışıyorum.

Herkes bir sorguda alt çizgi karakteri nasıl belirteceğini veya kaçış karakteri olabilir / ne olabilir biliyor mu?

MDHald'ın yanıtı , dosya coğrafi veritabanları için çalışır, ancak benim durumum Oracle'a özgüdür. Yanlışlıkla ArcSDE ve dosya coğrafi veritabanı sorgusunun bu durum için aynı şekilde işlev göreceği varsayılmıştır.


Escape karakteri genellikle ters eğik çizgi olur \ - bunun Oracle için de geçerli olduğuna inanıyorum, bu nedenle alt çizgiyi ararsanız bakmak istersiniz \_.
Midavalo

@Midavalo, akla ilk gelen şey buydu. Sorgum, sıfır sonuç döndüren CABLE = '_____ \ _%' idi.
Eok

kullanmanız gerekebilir LIKE(sorunuzda LIKE'den bahsetmenize rağmen) - CABLE LIKE '____\_%'. Oracle yerine SQL Server kullanmamıza rağmen burada bir oyun oynayacağım, bu yüzden farklı sonuçlar alabilirsiniz
Midavalo


1
@Midavalo, aynısını siz yaptıktan hemen sonra buldu
Eok

Yanıtlar:


7

Cevabı bulmayı başardı.

Sorguda aşağıdaki gibi bir ESCAPE karakteri belirtebilirsiniz:

MY_FIELD GİBİ '____ $ _%' ESCAPE '$'

Bu, tam olarak 4 karakter ve ardından bir alt çizgi karakteri ve bundan sonraki her şeyi arar.

Bu sayfadaki belgeleri bulduk : http://desktop.arcgis.com/en/arcmap/10.3/map/working-with-layers/sql-reference-for-query-expressions-used-in-arcgis.htm

Bunun ne kadar geri veya hangi sürümler için geçerli olduğundan emin değilim, ancak ArcGIS Desktop 10.3 için çalışıyor.

Belgelerden alıntı:

x [DEĞİL] GİBİ y [KAÇIŞ 'kaçış karakteri']

Kısmi dize araması oluşturmak için LIKE işlecini (= operatörü yerine) joker karakterlerle kullanın. Yüzde simgesi (%) yerine herhangi bir şey kabul edilebilir demektir: bir karakter, yüz karakter veya karakter yok. Alternatif olarak, bir karakteri temsil eden joker karakterle arama yapmak istiyorsanız, alt çizgi (_) kullanın. Karakter olmayan verilere erişmeniz gerekiyorsa CAST işlevini kullanın. Örneğin, bu sorgu SCORE_INT tamsayı alanından 8 ile başlayan sayıları döndürür:

CAST (VARCHAR OLARAK "SCORE_INT") '% 8' GİBİ

Arama dizenize yüzde sembolü veya alt çizgi eklemek için, kaçış karakteri olarak başka bir karakter atamak için ESCAPE anahtar sözcüğünü kullanın; bu da gerçek bir yüzde işaretinin veya alt çizginin hemen ardından geldiğini gösterir. Örneğin, bu ifade% 10 İNDİRİM veya% A10 gibi% 10 içeren herhangi bir dize döndürür:

"AMOUNT" GİBİ '% 10 $ %%' ESCAPE '$'


3

Bunun çalışması için CHAR_LENGTH ve SUBSTRING kullanmanız gerekecek. Aşağıdaki gibi görünecektir:

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

burada alan adınız = alanınızın adı.

Yine de koddaki "" öğesini silmeyin. Olduğu gibi kopyalayın ve yalnızca alan adınızdaki metni değiştirin.


Cevabınız dosya coğrafi veritabanları için çalışıyor, ancak altta yatan DBMS'nin bu kadar seçici olacağını fark etmedim. Oracle sorguyu beğenmiyor.
Eok

Oracle [DATABASE] ile biraz zorlaşıyor .. [TABLENAME] bu iki noktayı gerektiriyor. Sorgu bir tanım olarak çalışmazsa, SDE'nizde (Oracle'dan çekiyorsanız bir kurulumunuz olduğunu varsayarak) her zaman bir görünüm oluşturabilirsiniz (veritabanınıza sağ tıklayın> Yeni> Görünüm> seçimini yapın) ve sonra yazın benzer bir sorgu.
MDHald

3

Bu Q&A ile karşılaştım ve neden bir ArcPy arama imlecinde imleci yalnızca _belirli bir metin alanında alt çizgi ( ) içeren kayıtlarla sınırlandırabilecek bir nerede cümlesi kullanamadığımı çözmeme yardımcı oldu .

Bulduğum zaman, sorunu göstermek için zaten bir kod snippet'i geliştirmiştim, bu yüzden bu çabayı boşa harcamak yerine, çözümü ekledim ve şimdi aynı problemle gelecekteki bir ziyaretçiye yardımcı olmak için buraya gönderiyorum.

Test bir dosya coğrafi veritabanı kullanır ve Masaüstü için ArcGIS 10.2.2'de çalıştırılır.

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

Çıktı:

>>> 
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
Bunun için teşekkürler ... "özel" karakter geçici çözüm ve sözdizimi üzerinde çok zaman harcamak .... Umarım bir dahaki sefere nerede bulmak hatırlıyorum.
Mike
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.