Menu

Fungsi String SQLite: SUBSTR, REPLACE, INSTR, dan Lainnya

Fungsi string praktis di SQLite: penggabungan, SUBSTR, INSTR, REPLACE, TRIM, dan pola untuk membersihkan serta membentuk ulang teks di dalam query.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

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 start sampai akhir.
  • Nilai start negatif dihitung dari akhir string.
  • Jika start melewati 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; NULL merusak hasilnya, jadi pakai COALESCE.
  • SUBSTR dan INSTR bersama-sama mencakup sebagian besar kebutuhan "cari lalu potong".
  • REPLACE mengganti setiap kemunculan substring literal.
  • TRIM dan kawan-kawannya menerima himpunan karakter kustom, bukan hanya spasi.
  • printf adalah alat yang tepat untuk output berformat.
  • LIKE untuk wildcard SQL yang tidak membedakan huruf besar kecil, GLOB untuk 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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai