Pilih berdasarkan Atribut berdasarkan rentang wildcard SQL


8

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?


Saya tidak tahu basis data ini, tetapi di 'sisi' mana ia mengurutkan digit? Artinya, apakah 0datang setelah Z(yang biasa, saya pikir), atau sebelumnya A? 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)?
Clockwork-Muse

Ketika menyortir lapangan di urutan menaik, string muncul sebagai berikut: !z,?,0,0a,1,10,2,ant,A,Ant,z,Z. Jadi karakter khusus, digit, huruf (peka huruf besar kecil).
Cindy Jayakumar

Jawaban:


9

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

  1. Gunakan * untuk kueri yang hanya melibatkan bidang GDB pribadi.

  2. Gunakan% untuk kueri yang hanya melibatkan kolom dbf.

  3. 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.


Saya mengerti bahwa wild card dapat digunakan, karena metode yang saya gunakan sebagian besar waktu untuk memilih substring 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.
Cindy Jayakumar

Terima kasih @ Torsten! Saya tidak pernah tahu bahwa dengan GDB pribadi yang digunakan * bukan% untuk wildcard.
Sparky

1

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

WHERE SUBSTRING("name", 1, 1) >= 'A'

daripada

WHERE "name" >= 'A'

Ini mungkin memiliki manfaat kinerja jika tidak ada yang lain.


Sebenarnya, tidak, SUBSTRINGmetode ini tidak mungkin meningkatkan kinerja, karena (biasanya) berarti bahwa indeks apa pun nameakan 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 menyadari SUBSTRING(column, 1, 1)akan mengembalikan hanya awal of the string
Clockwork-Muse

Apakah saya dapat mengatasi sensitivitas kasus dengan menggunakan upper? Saya tidak khawatir tentang kasus untuk latihan ini, tetapi akan baik untuk diingat.
Cindy Jayakumar

Ya, Anda benar sekali. Tidak mungkin ada manfaat kinerja untuk menggunakan SUBSTRING dalam kasus ini, dan bisa memiliki efek sebaliknya.
pecoanddeco
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.