Saya ingin memilih semua catatan dari tabel geodatabase di mana string dimulai dengan huruf, jadi saya mencoba
SELECT *
FROM tbl_names
WHERE "name" LIKE '[A-Z]%'
Ini tidak mengembalikan catatan. Setelah beberapa pencarian, saya menemukan bahwa ini adalah sintaks SQL Server. Saya tidak berpikir ini akan menjadi masalah, sejauh yang saya tahu semua versi dukungan SQL %
. Setelah memeriksa file bantuan untuk membuat ekspresi query , saya melihat bahwa sintaks yang benar adalah
SELECT *
FROM tbl_names
WHERE "name" >= 'A'
Karena semua namanya adalah string, naluri pertamaku adalah mencoba LIKE
. Mengapa bukan >=
operator yang digunakan LIKE
? Apakah rentang wildcard tidak didukung di ArcMap?
arcmap
sql
arcgis-10.1
Cindy Jayakumar
sumber
sumber
0
datang setelahZ
(yang biasa, saya pikir), atau sebelumnyaA
? Sejumlah DBMS lain tidak mendukung fungsi semacam ini, jadi Anda harus menggunakan pengetahuan tentang hal-hal yang sedikit berbeda. Juga, bagaimana dengan karakter huruf kecil (atau semuanya huruf besar)? Dan bagaimana dengan karakter non-Inggris (bukan AZ)?!z,?,0,0a,1,10,2,ant,A,Ant,z,Z
. Jadi karakter khusus, digit, huruf (peka huruf besar kecil).Jawaban:
Wildcard secara umum didukung oleh ArcMap. Berikut ini kutipan dari bantuan yang Anda dapatkan saat melakukan 'Pilih berdasarkan Atribut':
Gunakan operator LIKE (bukan operator =) untuk membuat pencarian string parsial. Misalnya, ungkapan ini akan memilih Mississippi dan Missouri di antara nama negara bagian AS:
"STATE_NAME" LIKE 'Miss%'
Anda dapat menggunakan lebih besar dari (>), kurang dari (<), lebih besar dari atau sama (> =), kurang dari atau sama (<=) dan BETWEEN operator untuk memilih nilai string berdasarkan urutan pengurutan. Misalnya, ungkapan ini akan memilih semua kota dalam cakupan dengan nama yang dimulai dengan huruf M hingga Z:
"CITY_NAME" >= 'M'
Operator tidak sama (<>
) juga dapat digunakan saat menanyakan string.Karakter Wildcard Karakter wildcard adalah simbol khusus yang mewakili satu atau lebih karakter.
Untuk data berbasis file apa pun, '%' berarti 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 '_'.
Misalnya, ungkapan ini akan memilih nama apa pun yang dimulai dengan huruf-huruf Cath, seperti Cathy, Catherine, dan Catherine Smith:
"NAME" LIKE 'Cath%'
Tetapi ungkapan ini akan menemukan Catherine Smith dan Katherine Smith:
"OWNER_NAME" LIKE '_atherine smith'
Wildcard yang Anda gunakan untuk query geodatabase pribadi adalah '*' untuk sejumlah karakter dan '?' untuk satu karakter.Karakter wildcard muncul sebagai tombol pada dialog permintaan. Anda bisa mengklik tombol untuk memasukkan wildcard ke ekspresi yang Anda buat. Hanya karakter wildcard yang sesuai dengan sumber data dari layer atau tabel yang Anda tanyakan yang ditampilkan.
Jika Anda menggunakan karakter wildcard dalam string dengan operator =, karakter tersebut diperlakukan sebagai bagian dari string, bukan sebagai wildcard.
Dengan tabel gabungan, gunakan wildcard yang sesuai untuk sisi gabungan yang Anda kueri. Jika kueri hanya berlaku untuk bidang dalam tabel target (tabel sisi kiri), gunakan wildcard tabel target. Jika kueri hanya berlaku untuk bidang dalam tabel bergabung (tabel sisi kanan), gunakan wildcard tabel bergabung. Jika kueri melibatkan bidang dari kedua sisi gabungan, gunakan wildcard '%' dan '_'.
Misalnya, jika Anda bergabung dengan file dbf (tabel bergabung) ke kelas fitur GDB pribadi (tabel target):
Gunakan * untuk kueri yang hanya melibatkan bidang GDB pribadi.
Gunakan% untuk kueri yang hanya melibatkan kolom dbf.
Gunakan% untuk kueri yang melibatkan kolom dari kedua sisi tabel.
Menurut ini: Saya pikir rentang tidak didukung, alih-alih Anda harus menggunakan> dan <, seperti yang Anda lakukan.
sumber
WHERE "name" LIKE '%substring%'
. Hanya ketika saya perlu mencari string dalam format tertentu, seperti regex dalam bentuk[0-9][0-9][A-Z]%
yang saya sadari bahwa itu tidak akan menerima rentang wildcard.Ya, Anda dapat menggunakan wildcard dalam pernyataan LIKE. Saya tidak pernah menggunakan rentang melalui ArcMap tetapi Anda menggunakan sintaks yang benar dari sudut pandang SQL Server.
Peringatan singkat jika Anda akan menggunakan operator '> ='. Hasil dari ini akan berbeda tergantung pada susunan apa yang ditetapkan. Ini dapat mengubah cara penyortiran dilakukan pada data, misalnya apakah itu case sensitif atau tidak. Jadi dalam beberapa kasus, Anda mungkin menemukan kueri Anda hanya mengembalikan nilai yang dimulai dengan huruf besar, dan kadang-kadang huruf besar dan kecil.
Lihat http://sqlblog.com/blogs/louis_davidson/archive/2007/05/20/sorting-and-case-sensitive-collations.aspx .
Juga, jika Anda hanya tertarik pada karakter pertama dari bidang tersebut maka Anda bisa menggunakannya
daripada
Ini mungkin memiliki manfaat kinerja jika tidak ada yang lain.
sumber
SUBSTRING
metode ini tidak mungkin meningkatkan kinerja, karena (biasanya) berarti bahwa indeks apa punname
akan diabaikan. Ya, Anda mungkin memiliki biaya yang lebih tinggi untuk perbandingan (panjang karakter yang diberikan), tetapi sebagian besar implementasi yang saya tahu akan kembali setelah karakter pertama dibandingkan ... Saya pribadi ragu pengoptimal apa pun yang ditulis untuk menyadariSUBSTRING(column, 1, 1)
akan mengembalikan hanya awal of the stringupper
? Saya tidak khawatir tentang kasus untuk latihan ini, tetapi akan baik untuk diingat.