SUBSTRING SQL: Potong Teks Sesuai Posisi
Blog/Tutorial SQL/SUBSTRING SQL: Potong Teks Sesuai Posisi

SUBSTRING SQL: Potong Teks Sesuai Posisi

BimaBima
·9 Februari 2026·9 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

TL;DR

SUBSTRING SQL mengambil sebagian teks dari sebuah kolom, dimulai dari posisi tertentu sepanjang jumlah karakter yang kamu tentukan: SUBSTRING(teks FROM posisi FOR panjang). Indeks karakter di SQL dimulai dari 1, bukan 0 seperti di Python. Kalau posisi potongnya berubah-ubah tiap baris, gabungkan SUBSTRING dengan POSITION supaya letak pemisahnya dihitung otomatis.

SUBSTRING ngambil sebagian teks dari sebuah kolom, mulai dari posisi tertentu sepanjang jumlah karakter yang kamu tentuin. Sintaks standarnya SUBSTRING(teks FROM posisi FOR panjang).

Kode order ORD-2026-JKT-0091 yang harus dipecah jadi tahun, kode kota, dan nomor urut? Itu kerjaan SUBSTRING.

Satu hal yang perlu kamu tanem duluan: indeks di SQL mulai dari 1. Bukan 0. Kalau kamu biasa nulis Python, ini sumber salah hitung nomor satu.

Apa itu SUBSTRING di SQL?

SUBSTRING adalah fungsi string SQL yang mengambil potongan teks dari sebuah nilai berdasarkan posisi awal dan panjang karakter. Karakter pertama ada di posisi 1.

SELECT SUBSTRING('ORD-2026-JKT-0091' FROM 5 FOR 4);
-- Hasil: 2026

Cara ngitungnya: hitung karakternya satu-satu dari kiri.

O  R  D  -  2  0  2  6  -  J   K   T   -   0   0   9   1
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17

Tahun mulai di posisi 5, panjangnya 4 karakter. Kode kota mulai di posisi 10, panjangnya 3.

Kalau kamu skip argumen panjang, SUBSTRING ngambil sampai ujung:

SELECT SUBSTRING('ORD-2026-JKT-0091' FROM 10);
-- Hasil: JKT-0091

Sintaks SUBSTRING per database

Ini yang sering bikin query copy-paste gagal jalan.

DatabaseSintaks
Standar ANSISUBSTRING(teks FROM 5 FOR 4)
PostgreSQLDua-duanya jalan: FROM...FOR dan SUBSTRING(teks, 5, 4)
MySQLSUBSTRING(teks, 5, 4) atau SUBSTR(teks, 5, 4)
SQL ServerSUBSTRING(teks, 5, 4) — panjang wajib diisi
OracleSUBSTR(teks, 5, 4) — namanya SUBSTR, bukan SUBSTRING

Yang paling aman: pakai sintaks koma SUBSTRING(teks, 5, 4). Jalan di PostgreSQL, MySQL, dan SQL Server. Cuma Oracle yang perlu ditulis ulang jadi SUBSTR.

Catatan penting buat SQL Server: argumen panjang wajib. SUBSTRING(kode, 10) bakal error di sana — kamu harus kasih angka besar, misal SUBSTRING(kode, 10, 100).

Contoh kasus: rekap omzet per kota dari kode order

Toko_berkah pakai format kode order ORD-2026-JKT-0091. Kode kota ada di dalam kode order — gak disimpan di kolom terpisah.

Buat rekap omzet per kota tahun 2026:

SELECT
    SUBSTRING(kode_order, 10, 3) AS kode_kota,
    COUNT(*)                     AS jumlah_order,
    SUM(total_bayar)             AS total_omzet
FROM pesanan
WHERE SUBSTRING(kode_order, 5, 4) = '2026'
GROUP BY SUBSTRING(kode_order, 10, 3)
ORDER BY total_omzet DESC;

Hasilnya:

kode_kota | jumlah_order | total_omzet
JKT       | 1            | 285000.00
MDN       | 1            | 32000.00
BDG       | 1            | 38000.00
SBY       | 1            | 18500.00

Query ini jalan, tapi ada masalah performa yang perlu kamu tau. Lihat bagian bawah.

Gimana kalau posisi potongnya beda-beda?

SUBSTRING sendirian butuh angka posisi yang pasti. Kalau teksnya panjangnya beda-beda, angka itu gak ada.

Contohnya email. budi@tokoberkah.co.id punya @ di posisi 5, tapi dewi@tokoberkah.co.id juga posisi 5, sementara muhammad.rizky@gmail.com di posisi 15.

Solusinya: gabungin sama POSITION.

SELECT
    email,
    SUBSTRING(email FROM POSITION('@' IN email) + 1) AS domain
FROM pesanan;

-- budi@tokoberkah.co.id  → tokoberkah.co.id
-- siti@gmail.com         → gmail.com

POSITION ngasih letak tanda @. Tambah 1 biar tanda @-nya sendiri gak ikut keambil. Dan karena argumen panjangnya gak diisi, SUBSTRING ngambil sampai ujung.

Nama fungsinya beda per database: POSITION di PostgreSQL, LOCATE di MySQL, CHARINDEX di SQL Server.

Pecah nama produk di tanda hubung

Kolom nama_produk di toko_berkah formatnya Beras Premium 5kg - Cap Jempol. Produk sebelum tanda hubung, merek sesudahnya.

SELECT
    TRIM(SUBSTRING(nama_produk FROM 1
         FOR POSITION(' - ' IN nama_produk) - 1))  AS produk,
    TRIM(SUBSTRING(nama_produk
         FROM POSITION(' - ' IN nama_produk) + 3)) AS merek
FROM pesanan;

-- produk: Beras Premium 5kg  |  merek: Cap Jempol

Angka 3 di + 3 itu panjang pemisahnya (' - ' = spasi, hubung, spasi). Salah hitung di sini bikin merek kamu keawalan spasi atau kehilangan huruf pertama.

TRIM di luar buat jaga-jaga. Kalau kamu di PostgreSQL, SPLIT_PART(nama_produk, ' - ', 1) ngerjain hal yang sama dengan rumus jauh lebih pendek — aku bahas ini di 12 fungsi string SQL.

SUBSTRING vs LEFT dan RIGHT

-- Ambil 3 karakter pertama
SUBSTRING(kode_order, 1, 3)   → ORD
LEFT(kode_order, 3)           → ORD   ← lebih pendek

-- Ambil 4 karakter terakhir
SUBSTRING(kode_order, 14, 4)  → 0091
RIGHT(kode_order, 4)          → 0091  ← lebih pendek, dan gak perlu ngitung posisi

Pakai LEFT atau RIGHT kalau potongannya nempel di ujung. Pakai SUBSTRING kalau di tengah.

RIGHT punya kelebihan tambahan: dia gak peduli panjang total teksnya. SUBSTRING(kode, 14, 4) bakal salah kalau ada kode order yang panjangnya beda.

Kesalahan umum

1. Ngira indeks mulai dari 0

SUBSTRING('ORD-2026', 0, 3)   → 'OR'  (bukan 'ORD')

Di PostgreSQL, posisi 0 dianggap sebelum karakter pertama, jadi kamu cuma dapet 2 karakter. Di SQL Server perilakunya mirip. Selalu mulai dari 1.

2. Nempelin SUBSTRING di WHERE

-- LAMBAT: index kode_order gak kepakai
WHERE SUBSTRING(kode_order, 5, 4) = '2026'

-- CEPAT: pakai LIKE dengan prefix
WHERE kode_order LIKE 'ORD-2026-%'

Versi LIKE bisa pakai index, karena wildcard-nya di belakang. Detail soal ini ada di operator LIKE SQL.

Kalau kamu sering butuh kode kota, mendingan simpan sebagai kolom sendiri waktu data masuk. Sekali kerja di depan, hemat scan seumur hidup tabelnya.

3. Panjang melebihi teksnya

SUBSTRING('ORD', 1, 100)   → 'ORD'  (gak error)

SUBSTRING gak error kalau kamu minta lebih banyak karakter dari yang ada — dia cuma ngasih sisanya. Ini justru berguna: pakai angka besar kayak 100 kalau kamu mau "sampai ujung" tapi database kamu wajibin argumen panjang.

4. Lupa TRIM setelah motong

Potongan sering nyisain spasi di ujung, terutama kalau pemisahnya berspasi. Spasi itu bikin JOIN dan GROUP BY kamu pecah diam-diam.

Referensi lengkap fungsi string ada di dokumentasi PostgreSQL, termasuk versi SUBSTRING yang nerima pola regex.

FAQ

Indeks SUBSTRING mulai dari 0 atau 1?

Dari 1. Karakter pertama ada di posisi 1, bukan 0 kayak di Python atau JavaScript. Kalau hasil potongan kamu meleset satu karakter, kemungkinan besar ini penyebabnya.

Apa bedanya SUBSTRING, LEFT, dan RIGHT?

LEFT dari kiri, RIGHT dari kanan, SUBSTRING dari posisi mana pun. Kalau potongannya nempel di ujung, LEFT dan RIGHT lebih pendek. SUBSTRING wajib kalau potongannya di tengah. Oracle gak punya LEFT dan RIGHT — di sana semuanya SUBSTR.

Gimana kalau posisi potongnya beda-beda?

Gabungin sama POSITION: SUBSTRING(email FROM POSITION('@' IN email) + 1). POSITION nyari letak pemisahnya otomatis. Di MySQL namanya LOCATE, di SQL Server CHARINDEX.

Apakah SUBSTRING di WHERE bikin query lambat?

Iya kalau kolomnya punya index — database gak bisa pakai index-nya dan terpaksa scan seluruh tabel. Ganti pakai LIKE dengan prefix, atau pecah kodenya jadi kolom sendiri waktu data masuk.

Penutup

Tiga hal yang perlu nempel.

Indeks mulai dari 1. Kalau posisi potongnya berubah-ubah, gabungin SUBSTRING sama POSITION. Dan jangan taruh SUBSTRING di WHERE kalau kolomnya punya index — pakai LIKE dengan prefix, atau simpan potongannya sebagai kolom sendiri.

Jalanin query di bagian sql_queries artikel ini. Ada kode order dari dua tahun berbeda dan empat kota, jadi kamu bisa langsung lihat hasil rekapnya berubah waktu filter tahunnya kamu ganti.

Kalau kamu perlu nyambungin teks, bukan motong, lanjut ke CONCAT SQL.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel Terkait

7 SQL Client Gratis Terbaik buat Analis Data (2026)
Tutorial SQL
10 Juli 2026•9 menit baca

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.

BimaBima
SQL Style Guide: Cara Nulis Query yang Enak Dibaca Tim
Tutorial SQL
7 Juli 2026•9 menit baca

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.

BimaBima
Take-Home Test SQL Data Analyst: Contoh Soal + Cara Ngerjainnya
Tutorial SQL
4 Juli 2026•11 menit baca

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.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

Copyright © 2026 - All rights reserved

LINKS
SupportPricingDatasetBlogAffiliates
LEGAL
Terms of servicesPrivacy policy
Ngulik Data
DatasetLeaderboardBlogStore