Topik ini membahas dua operator pencocokan pola (pattern matching) pada SQLite, yaitu LIKE dan GLOB, yang mencocokkan teks terhadap pola yang memuat karakter pengganti (wildcard). Keduanya dibandingkan langsung pada data yang sama agar perbedaan sensitivitas huruf beserta peta karakternya terlihat jelas. Tabel latihannya tetap tabel buku perpustakaan, dan tabel peminjaman muncul pada satu contoh. Setelah membaca, pencarian berdasarkan awalan, akhiran, dan fragmen teks dapat ditulis dengan operator yang tepat.
Dataset contoh#
Blok berikut membangun ulang tabel buku lalu menampilkan kolom judulnya. Duplikasi judul yang ada sejak awal modul ini justru berguna pada topik ini, karena setiap kecocokan pola menunjukkan seluruh baris yang memenuhinya.
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
(1, 'Dasar Algoritma', 'Ali', 2019, 4),
(2, 'Peta Langit', 'Budi', 2021, 0),
(3, 'Dasar Algoritma', 'Citra', 2021, 2),
(4, 'Sejarah Kertas', 'Dewi', 2019, 3),
(5, 'Kode dan Sandi', 'Eka', 2023, 5),
(6, 'Jejak Angin', 'Farhan', 2020, 0),
(7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku;Dasar Algoritma
Peta Langit
Dasar Algoritma
Sejarah Kertas
Kode dan Sandi
Jejak Angin
Peta LangitKetujuh judul ini menjadi bahan uji seluruh contoh pada topik ini. Judul-judulnya sengaja bervariasi awalan dan panjangnya, mulai dari D, P, S, K, hingga J, agar satu pola tidak menangkap semuanya sekaligus. Dua judul yang berulang juga menunjukkan bahwa pencocokan pola bekerja per baris, bukan per nilai unik, sebab setiap baris dinilai terpisah oleh operator. Judul kembar pada tabel ini membuat sebagian kecocokan tampil berpasangan, dan itu wajar karena keduanya baris yang berbeda. Setiap pola pada bagian berikutnya diuji terhadap daftar ini, sehingga kecocokan maupun kegagalannya dapat diperiksa dengan mata. Untuk mengulang eksperimennya, simpan setiap blok sebagai berkas .sql lalu jalankan dengan sqlite3 pada basis data dalam memori, atau tempel pernyataannya pada sesi interaktif, sebagaimana dilakukan pada topik-topik lain modul ini.
LIKE dengan wildcard#
LIKE memakai dua karakter pengganti. Tanda % mewakili deret karakter apa pun, termasuk deret kosong, sedangkan tanda _ mewakili tepat satu karakter apa pun. Pola 'P%' berarti teks yang diawali huruf P, dan jalankan query berikut untuk membuktikannya.
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
(1, 'Dasar Algoritma', 'Ali', 2019, 4),
(2, 'Peta Langit', 'Budi', 2021, 0),
(3, 'Dasar Algoritma', 'Citra', 2021, 2),
(4, 'Sejarah Kertas', 'Dewi', 2019, 3),
(5, 'Kode dan Sandi', 'Eka', 2023, 5),
(6, 'Jejak Angin', 'Farhan', 2020, 0),
(7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul LIKE 'P%';Peta Langit
Peta LangitKedua salinan Peta Langit lolos, sedangkan judul lain tersaring karena tidak diawali P. Pola yang diawali % menyasar akhiran, dan pola yang ditempatkan di tengah menyasar fragmen. Query berikut memakai _ pada posisi kedua untuk mengambil judul yang huruf keduanya adalah e.
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
(1, 'Dasar Algoritma', 'Ali', 2019, 4),
(2, 'Peta Langit', 'Budi', 2021, 0),
(3, 'Dasar Algoritma', 'Citra', 2021, 2),
(4, 'Sejarah Kertas', 'Dewi', 2019, 3),
(5, 'Kode dan Sandi', 'Eka', 2023, 5),
(6, 'Jejak Angin', 'Farhan', 2020, 0),
(7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul LIKE '_e%';Peta Langit
Sejarah Kertas
Jejak Angin
Peta LangitEmpat judul memenuhi pola itu, dan setiap judul terlihat memang memiliki e pada huruf kedua. Kata NOT membalik kecocokan, sehingga NOT LIKE '%Algoritma%' mengambil semua judul yang tidak memuat fragmen tersebut.
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
(1, 'Dasar Algoritma', 'Ali', 2019, 4),
(2, 'Peta Langit', 'Budi', 2021, 0),
(3, 'Dasar Algoritma', 'Citra', 2021, 2),
(4, 'Sejarah Kertas', 'Dewi', 2019, 3),
(5, 'Kode dan Sandi', 'Eka', 2023, 5),
(6, 'Jejak Angin', 'Farhan', 2020, 0),
(7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul NOT LIKE '%Algoritma%';Peta Langit
Sejarah Kertas
Kode dan Sandi
Jejak Angin
Peta LangitContoh terakhir menerapkan pola pada kolom nama di tabel peminjaman, untuk mengambil peminjam yang namanya tidak memuat huruf a sama sekali.
CREATE TABLE peminjaman (
id INTEGER PRIMARY KEY,
nama TEXT,
buku_id INTEGER,
tanggal_pinjam TEXT
);
INSERT INTO peminjaman VALUES
(1, 'Ali', 1, '2026-03-01'),
(2, 'Budi', 2, '2026-03-03'),
(3, 'Citra', 3, '2026-03-03'),
(4, 'Dewi', 1, '2026-03-07'),
(5, 'Eka', 5, '2026-03-10'),
(6, 'Farhan', 6, '2026-03-12');
SELECT nama FROM peminjaman WHERE nama NOT LIKE '%a%';Budi
DewiKeluarannya hanya Budi dan Dewi, karena nama lain memuat huruf a pada posisi mana pun. Perlu dicatat bahwa LIKE tidak membedakan huruf besar dan kecil, sehingga huruf A pada Ali juga cocok dengan pola %a%. Sifat ini dibahas khusus pada bagian berikutnya.
LIKE tidak peka huruf untuk ASCII#
LIKE mengabaikan perbedaan huruf besar dan kecil, tetapi hanya untuk huruf ASCII, yaitu a hingga z beserta kapitalnya. Jalankan query berikut yang polanya ditulis dengan huruf kecil seluruhnya.
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
(1, 'Dasar Algoritma', 'Ali', 2019, 4),
(2, 'Peta Langit', 'Budi', 2021, 0),
(3, 'Dasar Algoritma', 'Citra', 2021, 2),
(4, 'Sejarah Kertas', 'Dewi', 2019, 3),
(5, 'Kode dan Sandi', 'Eka', 2023, 5),
(6, 'Jejak Angin', 'Farhan', 2020, 0),
(7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul LIKE 'peta%';Peta Langit
Peta LangitPola 'peta%' dengan p kecil tetap mencocokkan Peta Langit yang diawali P besar. Perilaku ini berlaku hanya pada huruf ASCII, yaitu a hingga z beserta kapitalnya, sehingga karakter di luar itu tetap dibandingkan secara peka huruf. Sifat ini juga berlaku pada pola yang hurufnya bercampur di tengah, bukan hanya pada awalan, karena yang menentukan hanyalah karakternya sedangkan perbedaan kapitalnya dilupakan. Penulisan pola dengan huruf kecil seluruhnya pun menjadi pilihan yang lazim demi konsistensi. Kelalaian yang lazim adalah mengira satu pola cukup ditulis dua versi hurufnya untuk LIKE, padahal untuk teks Latin dasar satu pola sudah mencakup keduanya. Sebaliknya, jangan mengandalkan sifat ini pada huruf beraksen, karena pola 'cafe%' tidak akan menemukan kata yang ditulis dengan e beraksen. Perbedaan ini menjadi pembeda utama dengan GLOB pada bagian berikutnya.
GLOB peka huruf besar-kecil#
GLOB adalah operator kembarannya yang memakai gaya pola shell Unix. Tanda * menggantikan % sebagai deret karakter apa pun, dan tanda ? menggantikan _ sebagai satu karakter apa pun. Beda yang paling menentukan adalah sensitivitasnya, karena GLOB membedakan huruf besar dan kecil. Jalankan query berikut dengan pola yang hurufnya persis sama dengan judulnya.
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
(1, 'Dasar Algoritma', 'Ali', 2019, 4),
(2, 'Peta Langit', 'Budi', 2021, 0),
(3, 'Dasar Algoritma', 'Citra', 2021, 2),
(4, 'Sejarah Kertas', 'Dewi', 2019, 3),
(5, 'Kode dan Sandi', 'Eka', 2023, 5),
(6, 'Jejak Angin', 'Farhan', 2020, 0),
(7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul GLOB 'Peta*';Peta Langit
Peta LangitKecocokan terjadi karena pola dan judulnya sama-sama diawali P besar. Pola 'peta*' dengan p kecil akan menghasilkan nol baris pada data ini, dan bukti angkanya ditampilkan pada bagian perbandingan. Tanda ? memperagakan posisi yang pasti, misalnya pola '???? *' yang mensyaratkan empat karakter, satu spasi, lalu sisanya bebas.
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
(1, 'Dasar Algoritma', 'Ali', 2019, 4),
(2, 'Peta Langit', 'Budi', 2021, 0),
(3, 'Dasar Algoritma', 'Citra', 2021, 2),
(4, 'Sejarah Kertas', 'Dewi', 2019, 3),
(5, 'Kode dan Sandi', 'Eka', 2023, 5),
(6, 'Jejak Angin', 'Farhan', 2020, 0),
(7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul GLOB '???? *';Peta Langit
Kode dan Sandi
Peta LangitHanya judul berkatapertama empat huruf yang lolos, yaitu Peta dan Kode, sedangkan Jejak, Dasar, dan Sejarah gagal karena kata pertamanya lebih panjang. GLOB juga mengenal kelas karakter [...] yang mengizinkan satu posisi diisi salah satu karakter dari daftarnya.
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
(1, 'Dasar Algoritma', 'Ali', 2019, 4),
(2, 'Peta Langit', 'Budi', 2021, 0),
(3, 'Dasar Algoritma', 'Citra', 2021, 2),
(4, 'Sejarah Kertas', 'Dewi', 2019, 3),
(5, 'Kode dan Sandi', 'Eka', 2023, 5),
(6, 'Jejak Angin', 'Farhan', 2020, 0),
(7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul GLOB '[Pp]eta*';Peta Langit
Peta LangitKelas [Pp] menerima P besar maupun p kecil pada posisi pertama, sehingga kedua penulisan judul diakomodasi secara terkendali. Teknik ini berguna ketika sensitivitas penuh terasa kaku tetapi sensitivitas penuh pula yang tidak diinginkan.
Membandingkan LIKE dan GLOB pada data yang sama#
Perbedaan keduanya paling mudah diamati pada satu teks dan tiga pola. SQLite menyediakan bentuk fungsi LIKE(pola, teks) dan GLOB(pola, teks) yang menghasilkan 1 bila cocok dan 0 bila tidak, sehingga ujinya bisa dijalankan tanpa tabel sama sekali.
SELECT LIKE('peta%', 'Peta Langit');
SELECT GLOB('peta*', 'Peta Langit');
SELECT GLOB('Peta*', 'Peta Langit');1
0
1Baris pertama menunjukkan LIKE dengan p kecil tetap cocok. Baris kedua menunjukkan GLOB dengan p kecil gagal, dan baris ketiga menunjukkan GLOB dengan P besar berhasil. Ringkasan perbedaannya sebagai berikut.
| Aspek | LIKE | GLOB |
|---|---|---|
| Deret karakter apa pun | % | * |
| Satu karakter apa pun | _ | ? |
| Sensitivitas huruf | tidak peka untuk ASCII | peka |
| Kelas karakter | tidak ada | [...] |
Kedua operator menguji seluruh teks, bukan potongannya, sehingga pola tanpa karakter pengganti berarti kecocokan penuh. Tabel di atas juga menjadi pengingat bahwa pola keduanya tidak saling dipertukarkan begitu saja.
Pola dengan karakter literal#
Pola yang seluruhnya berupa karakter biasa bertindak sebagai kecocokan penuh, dan LIKE-nya tetap tidak peka huruf. Jalankan query berikut yang polanya tanpa karakter pengganti sama sekali.
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
(1, 'Dasar Algoritma', 'Ali', 2019, 4),
(2, 'Peta Langit', 'Budi', 2021, 0),
(3, 'Dasar Algoritma', 'Citra', 2021, 2),
(4, 'Sejarah Kertas', 'Dewi', 2019, 3),
(5, 'Kode dan Sandi', 'Eka', 2023, 5),
(6, 'Jejak Angin', 'Farhan', 2020, 0),
(7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul LIKE 'Kode dan Sandi';Kode dan SandiPersoalan muncul ketika karakter %, _, atau * justru ingin dicari sebagai karakter biasa, misalnya pada teks yang memuat angka persen. Pada LIKE, karakter pengganti dilucuti dengan klausa ESCAPE yang menetapkan satu karakter pelolos.
SELECT 'ab_cd' LIKE 'ab\_cd' ESCAPE '\';
SELECT 'abXcd' LIKE 'ab\_cd' ESCAPE '\';1
0Tanpa ESCAPE, pola 'ab_cd' akan mencocokkan kedua teks karena _ menerima karakter apa pun. Dengan ESCAPE, garis miring terbalik membuat _ menjadi literal, sehingga hanya ab_cd yang cocok. Pada GLOB, klausa ESCAPE tidak tersedia, dan karakter *, ?, serta [ yang ingin dicari secara literal ditulis di dalam kelas, misalnya [*]. Teknik pelolosan ini diperlukan pada data teknis yang memuat tanda tersebut, misalnya kode berformat AB_12 atau tanda persen pada catatan teks. Karena itu begitu pola memuat karakter khusus, ujilah kecocokannya pada teks yang sengaja tidak cocok, sebagaimana baris kedua pada contoh di atas.
Kesalahan umum#
Kesalahan yang paling sering terjadi adalah memakai pola bergaya LIKE pada GLOB, atau sebaliknya, karena tanda % pada GLOB diperlakukan sebagai karakter biasa. Uji berikut menunjukkan akibatnya pada satu teks.
SELECT GLOB('Peta%', 'Peta Langit');
SELECT GLOB('Peta%', 'Peta%');0
1Baris pertama menghasilkan 0 karena tidak ada judul yang benar-benar memuat tanda persen, dan baris kedua menghasilkan 1 hanya karena teksnya kebetulan memuat tanda persen itu secara literal. Perbaikannya adalah mengganti % dengan * sebelum memakai GLOB. Kesalahan kedua yang senada adalah mengharapkan GLOB tidak peka huruf sebagaimana LIKE, sehingga pola 'peta*' gagal menemukan Peta Langit, dan perbaikannya adalah menuliskan pola dengan huruf yang persis atau memakai kelas karakter. Kedua kesalahan itu berjalan tanpa error, sehingga satu-satunya petunjuknya adalah daftar hasil yang kosong. Karena tidak ada pesan error yang muncul, hasil kosong semacam ini kerap disalahartikan sebagai data yang memang tidak ada, padahal polanya yang keliru. Kebiasaan yang mencegahnya adalah memeriksa kembali peta karakter pada tabel perbandingan sebelum menulis pola, karena % dan _ milik LIKE, sedangkan * dan ? milik GLOB.
Ringkasan#
- LIKE memakai
%dan_serta mengabaikan huruf besar-kecil untuk ASCII, sedangkan GLOB memakai*dan?serta peka huruf. - NOT LIKE dan NOT GLOB membalik kecocokan pola terhadap seluruh teks.
- Literal
%atau_pada LIKE ditangani dengan klausa ESCAPE, dan literal*pada GLOB ditulis di dalam kelas[*]. - Kelas karakter
[...]pada GLOB mengizinkan satu posisi diisi salah satu karakter dari daftarnya.
Referensi#
- Ekspresi — Dokumentasi SQLite — Definisi operator LIKE dan GLOB beserta wildcard dan klausa ESCAPE.