Permintaan karakter garis bawah di ArcMap?


10

Untuk kueri SEPERTI standar terhadap kelas fitur ArcSDE berbasis Oracle, karakter garis bawah mewakili wildcard karakter tunggal ketika digunakan dengan string.

Saya mencoba untuk memaksakan kueri definisi untuk menemukan string teks yang dimulai dengan 4 digit diikuti oleh karakter garis bawah.

Adakah yang tahu bagaimana saya akan menentukan karakter garis bawah itu sendiri dalam kueri atau jika / apa karakter pelariannya?

Jawaban MDHald berfungsi untuk file geodatabases tetapi kasus saya khusus untuk Oracle. Salah berasumsi bahwa ArcSDE dan mengajukan permintaan geodatabase akan berfungsi sama untuk kasus ini.


Escape karakter biasanya backslash \ - Saya percaya ini juga terjadi dengan Oracle, jadi Anda ingin mencari \_jika mencari garis bawah.
Midavalo

@Midavalo, itu adalah hal pertama yang terlintas di benak saya. Permintaan saya adalah CABLE = '_____ \ _%', yang mengembalikan hasil nol.
Eok

Anda mungkin perlu menggunakan LIKE(meskipun Anda menyebutkan SEPERTI dalam pertanyaan Anda) - CABLE LIKE '____\_%'. Saya akan bermain di sini walaupun saya menggunakan SQL Server daripada Oracle sehingga mungkin mendapatkan hasil yang berbeda
Midavalo


1
@ Midavalo, menemukan hal yang sama persis setelah Anda melakukannya
Eok

Jawaban:


7

Berhasil melacak jawabannya.

Anda dapat menentukan karakter ESCAPE dalam kueri seperti:

MY_FIELD SUKA '____ $ _%' ESCAPE '$'

Ini akan mencari tepat 4 karakter diikuti oleh karakter garis bawah plus yang lain setelah itu.

Ditemukan dokumentasi di halaman ini: http://desktop.arcgis.com/en/arcmap/10.3/map/working-with-layers/sql-reference-for-query-expressions-used-in-arcgis.htm

Tidak yakin seberapa jauh ke belakang atau versi apa ini valid untuk tetapi berfungsi untuk ArcGIS Desktop 10.3.

Kutipan dari dokumentasi:

x [TIDAK] SEPERTI y [ESCAPE 'escape-character']

Gunakan operator LIKE (bukan operator =) dengan wildcard untuk membangun pencarian string parsial. Simbol persen (%) berarti bahwa segala sesuatu dapat diterima sebagai gantinya: satu karakter, seratus karakter, atau tanpa karakter. Atau, jika Anda ingin mencari dengan wildcard yang mewakili satu karakter, gunakan garis bawah (_). Jika Anda perlu mengakses data bukan karakter, gunakan fungsi CAST. Misalnya, kueri ini mengembalikan angka yang dimulai dengan 8 dari bidang bilangan bulat SCORE_INT:

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

Untuk menyertakan simbol persen atau garis bawah dalam string pencarian Anda, gunakan kata kunci ESCAPE untuk menunjuk karakter lain sebagai karakter pelarian, yang pada gilirannya menunjukkan bahwa tanda persen nyata atau garis bawah segera menyusul. Misalnya, ungkapan ini mengembalikan string yang mengandung 10%, seperti 10% DISKON atau A10%:

"JUMLAH" SEPERTI '% 10 $ %%' ESCAPE '$'


3

Anda harus menggunakan CHAR_LENGTH dan SUBSTRING agar ini berfungsi. Itu akan terlihat sebagai berikut:

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

dimana yourfieldname = nama bidang Anda.

Jangan hapus "" dalam kode. Salin apa adanya dan ganti hanya teks nama belakang Anda.


Jawaban Anda berfungsi untuk file geodatabases, tetapi saya tidak menyadari bahwa DBMS yang mendasarinya akan sangat pemilih. Oracle tidak menyukai kueri.
Eok

Oracle menjadi sedikit rumit dengan [DATABASE] .. [TABLENAME] itu membutuhkan dua poin tersebut. Jika kueri tidak berfungsi sebagai definisi, Anda selalu dapat membuat tampilan (klik kanan di basis data Anda> pilih Baru> pilih Lihat>) di SDE Anda (Anggap Anda memiliki satu pengaturan jika Anda menarik dari Oracle) dan kemudian menulis permintaan serupa.
MDHald

3

Saya menemukan T&J ini yang membantu saya untuk memecahkan mengapa saya tidak dapat menggunakan klausa di mana pada kursor pencarian ArcPy yang dapat membatasi kursor hanya pada catatan yang berisi garis bawah ( _) dalam bidang teks tertentu.

Pada saat saya menemukannya saya sudah mengembangkan potongan kode untuk menggambarkan masalah sehingga, daripada menyia-nyiakan upaya itu, saya telah menambahkan solusinya dan sekarang mempostingnya di sini untuk mungkin membantu pengunjung masa depan dengan masalah yang sama.

Pengujian menggunakan file geodatabase dan dijalankan di ArcGIS 10.2.2 untuk 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 :-)")

Outputnya adalah:

>>> 
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
Terima kasih untuk itu ... buang begitu banyak waktu untuk "karakter khusus" dan sintaksis .... semoga saya ingat di mana menemukannya nanti.
Mike
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.