Sebagian Besar Query Nyata Berurusan dengan String
Angka itu mudah. String-lah yang membuat query jadi berantakan: nama dengan spasi nyasar, email dengan huruf besar kecil campur, ID yang disambung dengan tanda hubung, kolom teks bebas yang hampir cocok tapi tidak persis. SQLite menyediakan sekumpulan kecil fungsi string yang terfokus, dan sebagian besar masalah ini bisa diatasi tanpa kode aplikasi.
Halaman ini membahas fungsi yang paling sering akan kamu pakai: penggabungan, pemotongan, pencarian, penggantian, pemangkasan, dan pemformatan.
Penggabungan Memakai ||, Bukan CONCAT
SQLite tidak punya fungsi CONCAT. String digabungkan dengan operator ||:
Angka dan tipe lainnya otomatis dikonversi menjadi teks. Ada jebakannya: jika salah satu operand bernilai NULL, seluruh ekspresi menjadi NULL. Itu perilaku SQL standar, tapi sering mengejutkan:
Bungkus kolom yang bisa bernilai null dengan COALESCE(col, '') atau COALESCE(col, 'default') jika kamu tidak ingin nilai yang hilang menghapus seluruh string.
Length, Upper, Lower
Tiga fungsi yang akan terus kamu pakai:
LENGTH mengembalikan jumlah karakter untuk teks, bukan jumlah byte. Kalau kamu memang butuh byte (jarang, tapi berguna untuk analisis penyimpanan), pakai OCTET_LENGTH. Secara default, UPPER dan LOWER hanya mengubah huruf ASCII: karakter beraksen tidak berubah kecuali kamu sudah memuat ekstensi ICU.
SUBSTR: Memotong String
SUBSTR(text, start, length) mengambil sebagian string. Indeksnya dimulai dari 1, jadi 1 adalah karakter pertama, bukan 0:
Beberapa hal yang perlu diingat:
- Argumen ketiga bersifat opsional. Tanpa argumen itu, kamu mendapat semuanya dari
startsampai akhir. - Nilai
startnegatif dihitung dari akhir string. - Jika
startmelewati akhir string, kamu mendapat string kosong, bukan error.
SUBSTRING juga diterima sebagai sinonim, kalau kebiasaanmu berasal dari database lain.
INSTR: Mencari Substring
INSTR(haystack, needle) mengembalikan posisi (dimulai dari 1) kemunculan pertama needle di dalam haystack, atau 0 jika tidak ditemukan:
Ekspresi terakhir itu adalah idiom SQLite untuk "semua yang ada sebelum @": cari delimiternya dengan INSTR, lalu potong dengan SUBSTR. Kombinasi ini akan sering kamu tulis. Perhatikan bahwa INSTR mengembalikan 0 saat tidak ada yang cocok, jadi periksa dulu sebelum memotong: memasukkan 0 ke SUBSTR diam-diam memberi hasil yang aneh.
REPLACE: Mengganti Satu Substring dengan yang Lain
REPLACE(text, old, new) mengganti setiap kemunculan old dengan new:
Fungsi ini membedakan huruf besar dan kecil dan tidak menerima regex, hanya substring literal. Untuk transformasi yang lebih rumit, kamu bisa merangkai beberapa pemanggilan REPLACE, tapi kalau sudah lebih dari dua atau tiga lapis, saatnya mengerjakannya di aplikasi.
TRIM, LTRIM, RTRIM
Data yang diketik user cenderung membawa spasi di ujung-ujungnya. TRIM membuangnya:
Secara default, fungsi-fungsi ini menghapus spasi. Berikan argumen kedua untuk menentukan karakter mana yang dibuang: setiap karakter di argumen kedua dianggap anggota "himpunan yang dihapus", bukan substring literal. Jadi TRIM('xxxhelloxx', 'x') menghasilkan 'hello'.
printf: Memformat Angka dan String
Saat kamu butuh string berformat, seperti jumlah desimal tetap, angka yang diberi padding, atau output heksadesimal, printf (juga bisa ditulis format) mengerjakannya:
Penanda format mengikuti konvensi C, artinya %d, %s, %f, %x, padding dengan 0 atau spasi, dan seterusnya. Ini jauh lebih rapi daripada menyusun string dengan || dan setumpuk CAST.
LIKE vs GLOB: Pencocokan Pola
Dua operator, dua dunia yang berbeda.
LIKE memakai wildcard klasik SQL, yaitu % untuk deretan karakter apa pun dan _ untuk satu karakter, dan tidak membedakan huruf besar kecil untuk ASCII:
GLOB memakai wildcard shell Unix, yaitu * untuk deretan apa pun, ? untuk satu karakter, dan [abc] untuk kelas karakter, dan membedakan huruf besar kecil:
Aturan memilihnya: LIKE untuk pencocokan ala manusia seperti "diawali dengan", "mengandung", "diakhiri dengan". GLOB saat pembedaan huruf besar kecil penting atau kamu butuh kelas karakter. Keduanya bisa memakai index, tapi hanya jika polanya terkunci di awal ('foo%', bukan '%foo'): wildcard di depan memaksa scan penuh.
Memisahkan String: Tidak Ada SPLIT
SQLite tidak menyediakan fungsi SPLIT_STRING. Ada dua cara praktis untuk mengakalinya:
Untuk memisahkan berdasarkan delimiter menjadi beberapa baris, cara paling rapi adalah json_each pada array JSON, atau CTE rekursif. Keduanya akan kita bahas di bab-bab berikutnya. Untuk sekarang, cukup ketahui bahwa "beri aku setiap kata" tidak bisa dikerjakan dalam satu baris di SQLite.
Contoh Lengkap: Merapikan Nama
Mari gabungkan semuanya. Bayangkan tabel users dengan nama tampilan yang berantakan: spasi berlebih, huruf besar kecil campur, dan gelar opsional seperti "Dr. " atau "Mr. " yang ingin kamu buang:
Ekspresinya dibaca dari dalam ke luar: buang spasi di luar, ubah ke huruf kecil, hapus gelarnya, lalu pangkas lagi kalau penghapusan gelar meninggalkan spasi di depan. Setiap langkah hanya satu fungsi, dan kerumitannya datang dari menumpuknya. Saat tumpukannya lebih dari tiga atau empat lapis, itu tanda untuk memakai kolom generated (Bab: Fitur Lanjutan) atau membersihkan datanya saat impor.
Yang Perlu Kamu Ingat
||untuk penggabungan;NULLmerusak hasilnya, jadi pakaiCOALESCE.SUBSTRdanINSTRbersama-sama mencakup sebagian besar kebutuhan "cari lalu potong".REPLACEmengganti setiap kemunculan substring literal.TRIMdan kawan-kawannya menerima himpunan karakter kustom, bukan hanya spasi.printfadalah alat yang tepat untuk output berformat.LIKEuntuk wildcard SQL yang tidak membedakan huruf besar kecil,GLOBuntuk pola gaya shell yang membedakannya.
Berikutnya: Fungsi Numerik
String sudah beres, tujuan berikutnya yang jelas adalah angka: pembulatan, nilai absolut, keanehan pembagian, dan fungsi matematika yang ditambahkan SQLite di versi-versi terbaru. Itu halaman berikutnya.
Pertanyaan yang sering diajukan
Bagaimana cara menggabungkan string di SQLite?
Gunakan operator ||, bukan CONCAT. Secara default SQLite tidak punya fungsi CONCAT: 'Hello, ' || name menggabungkan dua string menjadi satu. Jika salah satu operand bernilai NULL, seluruh hasilnya menjadi NULL, jadi bungkus kolom yang bisa bernilai null dengan COALESCE jika kamu tidak menginginkan itu.
Bagaimana cara mengambil substring di SQLite?
Gunakan SUBSTR(text, start, length), yang juga bisa ditulis SUBSTRING. Indeksnya dimulai dari 1: SUBSTR('hello', 1, 3) mengembalikan 'hel'. Nilai start negatif dihitung dari akhir, dan argumen length bersifat opsional: hilangkan saja untuk mengambil semuanya sampai akhir.
Apakah SQLite punya fungsi SPLIT_STRING?
Tidak, SQLite tidak punya fungsi split bawaan. Dalam kebanyakan kasus, kamu bisa menggabungkan INSTR dan SUBSTR untuk mengambil bagian yang kamu mau, atau memakai CTE rekursif untuk memisahkan berdasarkan delimiter. Kalau sering membutuhkannya, fungsi json_each pada array JSON biasanya lebih rapi daripada membuat pemisah sendiri.
Apa perbedaan LIKE dan GLOB di SQLite?
Secara default, LIKE tidak membedakan huruf besar dan kecil untuk ASCII dan memakai % serta _ sebagai wildcard. GLOB membedakan huruf besar dan kecil dan memakai wildcard shell Unix (*, ?, [abc]). Pakai GLOB saat kamu butuh pembedaan huruf besar kecil atau kelas karakter, dan pakai LIKE untuk pencocokan gaya SQL yang lebih umum.