TL;DR
TRIM SQL menghapus spasi di awal dan akhir sebuah teks. Sintaks dasarnya TRIM(kolom), dengan varian LTRIM buat sisi kiri dan RTRIM buat sisi kanan. Spasi tersembunyi adalah penyebab paling sering JOIN antar tabel gagal mencocokkan baris yang secara visual terlihat identik, karena database membandingkan string karakter per karakter.
TRIM hapus spasi di awal dan akhir sebuah teks. Sintaksnya TRIM(kolom).
Kedengeran remeh sampai kamu nulis JOIN yang logikanya bener 100%, hasilnya 0 baris, dan kamu ngabisin sejam nyari yang salah.
Pelakunya sering cuma satu spasi di ujung nama kota. Yang nggak keliatan di layar.
TRIM adalah fungsi string yang buang spasi kosong di kedua ujung teks. Spasi di tengah tetap dibiarkan.
SELECT TRIM(' Bandung ') AS kota;
-- hasil: 'Bandung'
Ada tiga varian yang perlu kamu kenal:
| Fungsi | Yang dipotong | Input | Hasil |
|---|---|---|---|
TRIM(kota) | Kiri dan kanan | ' Bandung ' | 'Bandung' |
LTRIM(kota) | Kiri aja | ' Bandung ' | 'Bandung ' |
RTRIM(kota) | Kanan aja | ' Bandung ' | ' Bandung' |
Buat pembersihan data sehari-hari, TRIM aja cukup. LTRIM dan RTRIM kepakai kalau kamu sengaja mau pertahanin indentasi di satu sisi.
Database bandingin teks karakter per karakter. 'Bandung' punya 7 karakter. 'Bandung ' punya 8.
Buat mata kamu, dua teks itu identik. Buat PostgreSQL, itu dua nilai berbeda. JOIN nyari kecocokan persis, nggak ketemu, baris itu hilang dari hasil.
Dan JOIN nggak ngasih error. Dia cuma diem-diem ngasih hasil yang lebih sedikit dari yang seharusnya. Ini yang bikin bug-nya berbahaya. Laporan tetap keluar, angkanya aja yang salah.
-- Kelihatan bener, tapi baris ' Jakarta' dan 'Bandung ' hilang
SELECT p.nama, p.kota, t.target_bulanan
FROM pelanggan p
JOIN target_kota t ON p.kota = t.kota;
Bandingin panjang teks asli sama panjang setelah di-TRIM. Kalau angkanya beda, ada spasi nyempil.
SELECT id, nama, kota,
LENGTH(kota) AS panjang_asli,
LENGTH(TRIM(kota)) AS panjang_bersih
FROM pelanggan
WHERE LENGTH(kota) <> LENGTH(TRIM(kota));
Query ini cuma nampilin baris yang bermasalah. Kalau hasilnya kosong, kolom kamu bersih. Kalau keluar 47 baris, nah itu tersangkanya.
Trik lain yang aku suka: bungkus nilainya pakai tanda kurung biar spasinya keliatan.
SELECT '[' || kota || ']' AS kota_terlihat
FROM pelanggan;
-- [Bandung ] ← ketauan
-- [Surabaya] ← bersih
Sederhana, tapi langsung kelihatan mana yang kotor.
Dataset toko_berkah punya tabel transaksi (3.400 baris) dan tabel target_cabang (12 baris). Aku JOIN dua tabel itu lewat kolom nama_cabang.
Hasilnya: 2.180 baris. Padahal semua transaksi harusnya punya cabang.
1.220 baris hilang. Setelah dicek, 4 dari 12 nama cabang di tabel transaksi punya spasi di ujung, sisa input manual dari kasir yang kepencet spasi sebelum Enter.
36% data transaksi nggak masuk laporan target. Dan nggak ada error message sama sekali.
-- Perbaikannya: TRIM di dua sisi JOIN
SELECT TRIM(t.nama_cabang) AS cabang,
SUM(t.total) AS omzet,
c.target_bulanan
FROM transaksi t
JOIN target_cabang c
ON TRIM(t.nama_cabang) = TRIM(c.nama_cabang)
GROUP BY 1, 3;
TRIM di dua-duanya, bukan cuma sebelah. Kalau cuma satu sisi yang dibersihin, kecocokannya tetap gagal.
TRIM di dalam JOIN itu tambal sulam. Jalan, tapi ada harganya.
Begitu kolom dibungkus fungsi, database nggak bisa pakai index di kolom itu. Query terpaksa scan seluruh tabel. Di tabel 5 juta baris, bedanya bisa dari 50 milidetik jadi belasan detik.
Solusi yang bener: bersihin datanya sekali.
BEGIN;
-- 1. Hitung dulu berapa baris yang bakal berubah
SELECT COUNT(*) FROM pelanggan WHERE kota <> TRIM(kota);
-- 2. Baru UPDATE
UPDATE pelanggan
SET kota = TRIM(kota)
WHERE kota <> TRIM(kota);
COMMIT;
WHERE-nya penting. Tanpa itu, database nulis ulang semua baris termasuk yang udah bersih.
Habis itu, cegah data kotor masuk lagi. Bikin constraint atau bersihin di lapisan aplikasi. Kalau nggak, bulan depan spasinya balik lagi.
Di PostgreSQL dan MySQL, TRIM bisa motong karakter apa aja, bukan cuma spasi.
SELECT TRIM(BOTH '0' FROM '0012340') AS hasil;
-- 1234
SELECT TRIM(LEADING '0' FROM '00123') AS hasil;
-- 123
Berguna buat kode produk yang di-pad nol di depan, atau kolom hasil import yang kebawa karakter aneh di ujung. Sintaks lengkapnya ada di dokumentasi fungsi string PostgreSQL.
Kalau yang mau kamu buang ada di tengah, bukan di ujung, itu urusan REPLACE SQL.
TRIM('Toko Berkah') hasilnya tetap 'Toko Berkah' dengan dua spasi. Spasi tengah butuh REPLACE atau REGEXP_REPLACE.REGEXP_REPLACE(kolom, '^\s+|\s+$', '', 'g').Spasi tersembunyi nggak eksklusif punya database. Di Excel, dia bikin VLOOKUP keluarin #N/A dengan alasan yang persis sama.
Fungsi Excel-nya juga namanya TRIM, tapi ada satu beda penting: TRIM di Excel juga padatkan spasi ganda di tengah, sementara TRIM di SQL nggak. Aku bahas di rumus TRIM Excel.
TRIM hapus spasi di kedua sisi. LTRIM cuma di kiri, RTRIM cuma di kanan. Buat pembersihan data biasa, TRIM aja cukup.
Bisa di PostgreSQL dan MySQL: TRIM(BOTH '0' FROM '0012340') hasilnya '1234'. Di SQL Server, TRIM dengan karakter kustom baru ada mulai versi 2022.
Database bandingin string karakter per karakter. 'Bandung' 7 karakter, 'Bandung ' 8 karakter. Cek pakai LENGTH(kolom) <> LENGTH(TRIM(kolom)).
Bersihin datanya sekali pakai UPDATE. TRIM di setiap query bikin index nggak kepakai dan query melambat di tabel besar.
Ya, kalau dipakai di WHERE atau JOIN. Kolom yang dibungkus fungsi bikin database scan seluruh tabel. Bersihin kolomnya permanen, atau bikin functional index.
Tiga hal yang bakal nyelametin kamu:
LENGTH(kolom) <> LENGTH(TRIM(kolom)). Lima detik.Kalau kolom kamu masih berantakan setelah spasinya beres, biasanya masalah berikutnya di huruf besar-kecil. Lanjut ke UPPER dan LOWER SQL.
Mau latihan nulis query pembersihan data langsung di browser? Coba modul fungsi string di NgulikSQL.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Analisa per kuartal, hari kerja, atau musim jadi ribet kalau tiap query ngitung ulang atribut tanggal. Tabel kalender nyimpen semua atribut itu sekali, biar tinggal di-JOIN.
Laporan penjualan harian sering bolong di hari tanpa transaksi. Ini cara bikin deret tanggal lengkap di SQL biar tiap hari muncul, walau nilainya nol.
Struktur organisasi tersimpan sebagai kolom id_atasan yang saling nunjuk. Ini cara narik rantai jabatan, hitung total bawahan, dan span of control cuma pakai SQL.