TRIM SQL: Hapus Spasi Tersembunyi yang Bikin JOIN Gagal
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.
Apa itu TRIM di SQL?
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.
Kenapa spasi tersembunyi bikin JOIN gagal?
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;
Gimana cara deteksi spasi tersembunyi?
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.
Contoh kasus: JOIN penjualan toko_berkah
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 query atau bersihin datanya?
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.
TRIM buat karakter selain spasi
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.
Kesalahan umum
- TRIM cuma di satu sisi JOIN. Dua-duanya harus bersih. Ini kesalahan paling sering.
- Ngira TRIM ngurusin spasi di tengah.
TRIM('Toko Berkah')hasilnya tetap'Toko Berkah'dengan dua spasi. Spasi tengah butuh REPLACE atau REGEXP_REPLACE. - TRIM di WHERE tanpa mikir index. Query kelihatan bener, tapi jadi lambat banget di tabel besar.
- Lupa TAB dan newline. TRIM standar cuma buang spasi (karakter 32), bukan tab atau line break. Buat itu pakai
REGEXP_REPLACE(kolom, '^\s+|\s+$', '', 'g'). - UPDATE tanpa transaksi. Kalau hasilnya nggak sesuai, kamu nggak bisa balikin. Selalu BEGIN dulu.
Di Excel, masalahnya sama
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.
FAQ
Apa bedanya TRIM, LTRIM, dan RTRIM di SQL?
TRIM hapus spasi di kedua sisi. LTRIM cuma di kiri, RTRIM cuma di kanan. Buat pembersihan data biasa, TRIM aja cukup.
Apakah TRIM bisa hapus karakter selain spasi?
Bisa di PostgreSQL dan MySQL: TRIM(BOTH '0' FROM '0012340') hasilnya '1234'. Di SQL Server, TRIM dengan karakter kustom baru ada mulai versi 2022.
Kenapa JOIN gagal padahal datanya kelihatan sama persis?
Database bandingin string karakter per karakter. 'Bandung' 7 karakter, 'Bandung ' 8 karakter. Cek pakai LENGTH(kolom) <> LENGTH(TRIM(kolom)).
Lebih baik TRIM di query atau bersihin datanya sekali?
Bersihin datanya sekali pakai UPDATE. TRIM di setiap query bikin index nggak kepakai dan query melambat di tabel besar.
TRIM ngaruh ke performa query nggak?
Ya, kalau dipakai di WHERE atau JOIN. Kolom yang dibungkus fungsi bikin database scan seluruh tabel. Bersihin kolomnya permanen, atau bikin functional index.
Penutup
Tiga hal yang bakal nyelametin kamu:
- JOIN yang hasilnya kurang dari ekspektasi? Cek spasi dulu, sebelum cek logika.
- Deteksi pakai
LENGTH(kolom) <> LENGTH(TRIM(kolom)). Lima detik. - Bersihin datanya permanen, jangan TRIM di setiap query.
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.
Artikel Terkait
7 SQL Client Gratis Terbaik buat Analis Data (2026)
Nggak perlu bayar buat nulis query. Ini 7 SQL client gratis yang beneran dipakai analis, plus kelebihan dan kekurangannya masing-masing.
SQL Style Guide: Cara Nulis Query yang Enak Dibaca Tim
Sepuluh aturan SQL style guide yang bikin query kamu kebaca sama tim — dan sama kamu sendiri 6 bulan lagi. Lengkap dengan contoh sebelum-sesudah.
Take-Home Test SQL Data Analyst: Contoh Soal + Cara Ngerjainnya
Contoh soal take-home test SQL yang beneran dipakai perusahaan, dikerjain step by step — dari baca soal, nulis query, sampai nyusun insight yang bikin recruiter nengok.