- Metin fonksiyonları ne zaman gerekir?
- Metin kesme: SUBSTRING, LEFT, RIGHT
- Metin birleştirme: CONCAT ve ayraçlı birleştirme
- Temizleme: TRIM, REPLACE, UPPER ve LOWER
- Örnek senaryo: müşteri verisini raporlamaya hazırlamak
- Sık yapılan hatalar ve performans notu
- Bu beceriyi Mindset programlarında nerede çalışırsınız?
- Sık sorulan sorular
SQL string fonksiyonları: metin verisini kesme, birleştirme ve temizleme
SQL'de metin kesme, birleştirme, temizleme ve arama fonksiyonlarını örnek senaryolarla öğrenin: SUBSTRING, CONCAT, TRIM, REPLACE ve sistem farkları.
Metin fonksiyonları ne zaman gerekir?
Gerçek veritabanlarında metin alanları nadiren temizdir. Ad ve soyad ayrı sütunlarda tutulur ama raporda birleşik gerekir; telefon numaraları farklı biçimlerde yazılmıştır; e-posta alan adı ayrı analiz edilmek istenir; ürün kodunun belirli bir bölümü kategoriyi taşır; metnin başında ve sonunda görünmeyen boşluklar vardır. Bu işlerin hepsi SQL metin fonksiyonlarıyla veritabanı katmanında çözülebilir.
Metin fonksiyonları şu ana işleri yapar: metni parçalamak, birleştirmek, temizlemek ve içinde arama yapmak. Raporlama, veri temizleme, birleştirme anahtarı üretme ve eşleştirme gibi pek çok analist görevinin ortak aracıdır.
Fonksiyon adları büyük ölçüde standarttır, ancak SQL Server, MySQL ve PostgreSQL arasında küçük farklılıklar bulunur. Aşağıda yaygın adlar verilir; kullandığınız sistemin belgesi her zaman esas alınmalıdır.
Metin kesme: SUBSTRING, LEFT, RIGHT
SUBSTRING bir metnin belirli bir konumundan başlayarak istenen uzunlukta bölümünü döndürür: SUBSTRING(metin, başlangıç, uzunluk). LEFT ve RIGHT ise metnin başından ya da sonundan belirli sayıda karakter alır. Konum sayımı birçok sistemde birden başlar, programlamadaki sıfır tabanlı sayıma alışkın olanlar için sık yapılan bir hata kaynağıdır.
Örneğin ürün kodunun baş harfleri kategoriyi belirtiyorsa, LEFT ile bu bölüm alınıp kategori sütunu üretilir. E-posta adresinden alan adını bulmak için ise adresteki @ işaretinin konumu bulunur (SQL Server'da CHARINDEX, MySQL'de LOCATE ya da INSTR, PostgreSQL'de POSITION) ve SUBSTRING ile bu konumdan sonrası alınır.
Sabit uzunluklu kodlarda kesme basittir; değişken uzunluklu metinlerde ise önce ayraç konumu bulunmalı, sonra kesme yapılmalıdır. Ayraç hiç yoksa konum fonksiyonu sıfır döndürür ve sorgu beklenmeyen sonuç verir; bu durum için CASE WHEN ile kontrol eklemek gerekir.
Metin birleştirme: CONCAT ve ayraçlı birleştirme
CONCAT birden çok metni art arda ekler. Ad ve soyadı tek sütunda göstermek, adres parçalarını tek satıra toplamak, rapor etiketi üretmek tipik kullanımlardır. Birçok sistemde || işareti ya da + işareti de birleştirme için kullanılır; ancak davranışları farklıdır.
En önemli fark NULL yönetimidir. + işaretiyle birleştirme SQL Server'da bir parça NULL ise tüm sonucu NULL yapabilir. CONCAT fonksiyonu ise NULL parçaları boş metin gibi ele alır. PostgreSQL'de || işareti NULL ile karşılaştığında NULL döndürür. Bu yüzden isteğe bağlı alanları (ara ad, apartman bilgisi) birleştirirken NULL davranışını bilmek ve gerekirse COALESCE kullanmak önemlidir.
Ayraçlı birleştirme için CONCAT_WS kullanılır: baştaki argüman ayraçtır, kalan parçalar bu ayraçla eklenir ve NULL parçalar atlanır. Böylece "İstanbul, Kadıköy" gibi adres satırında boş parçalar yüzünden gereksiz virgül oluşmaz.
Satırları gruplayıp metinleri tek hücrede toplamak için ise STRING_AGG (SQL Server, PostgreSQL) ya da GROUP_CONCAT (MySQL) kullanılır.
Temizleme: TRIM, REPLACE, UPPER ve LOWER
TRIM metnin başındaki ve sonundaki boşlukları siler. Formdan ya da dosyadan gelen verilerde sık görülen gizli boşluklar, aynı müşterinin ayrı kayıtlar gibi görünmesine ve JOIN eşleşmemesine neden olur. Eski SQL Server sürümlerinde LTRIM ve RTRIM ayrı kullanılırdı; güncel sürümler TRIM'i de destekler.
REPLACE bir metin parçasını başka bir parçayla değiştirir. Telefon numaralarındaki parantez, tire ve boşlukları kaldırmak ya da bir alan adını güncellemek için kullanılır. Birden çok karakteri temizlemek için REPLACE iç içe yazılır.
UPPER ve LOWER harf büyüklüğünü sabitler. Karşılaştırma ve eşleştirmede büyük küçük harf farkı yüzünden kaçan kayıtları yakalamak için karşılaştırılan değerleri aynı biçime getirmek yararlıdır. Türkçe karakterlerde dikkat gerekir: i ve ı harflerinin büyük harf dönüşümü veritabanının harmanlama (collation) ayarına bağlıdır ve beklenmeyen sonuç verebilir.
LEN (SQL Server) ya da LENGTH (MySQL, PostgreSQL) metin uzunluğunu verir; boş veya anormal kısa değerleri yakalamak için veri kontrolünde kullanılır.
Örnek senaryo: müşteri verisini raporlamaya hazırlamak
Örneğin bir müşteri tablosunda ad, soyad ve e-posta alanları bulunuyor; amaç, kurumsal e-posta alan adlarına göre müşteri sayısını görmek. Önce ad ve soyad TRIM ile temizlenir, ardından CONCAT ile tam ad üretilir. E-posta adresi LOWER ile küçük harfe çevrilir; çünkü aynı adres farklı harf büyüklükleriyle girilmiş olabilir.
Sonra @ işaretinin konumu bulunur ve SUBSTRING ile alan adı ayıklanır. Gruplama bu yeni sütun üzerinden yapılır. Gmail benzeri bireysel alan adlarını ayırmak için ayrı bir CASE WHEN eklenir. Böylece ham veriden, iş kullanıcısının doğrudan yorumlayabileceği bir özet üretilmiş olur.
Aynı mantık, farklı sistemlerden gelen ürün kodlarını standartlaştırmada ya da kullanıcı adlarından e-posta üretmede de kullanılır. Karmaşıklaşan bir temizlik zinciri tek bir sorgu yerine ara adımlar olarak (CTE ya da görünüm) kurulursa hem test etmek hem de hataları izlemek kolaylaşır.
Sık yapılan hatalar ve performans notu
En sık hata, NULL değerini hesaba katmamaktır. Metin fonksiyonları genellikle NULL girdiye NULL döner; birleştirme ve uzunluk hesabında beklenmedik boşluklar bunun sonucudur. Bir başka yaygın hata, konum sayımını yanlış varsaymaktır; başlangıç konumu bir ise sıfırdan başlatılan SUBSTRING bir karakter kaydırır.
Performans tarafında önemli bir nokta: WHERE koşulunda sütunu fonksiyonla sarmak indeks kullanımını engelleyebilir. WHERE LOWER(ad) = 'ali' gibi bir koşul büyük tablolarda yavaş çalışır. Çözüm olarak karşılaştırmayı büyük küçük harfe duyarsız bir harmanlama ile yapmak ya da hesaplanmış bir sütun üzerinde indeks kurmak değerlendirilebilir.
Diğer hatalar: • Metin olarak saklanan sayı ve tarihleri dönüştürmeden metin fonksiyonlarıyla işlemeye çalışmak • Uzun metinlerde kesme sonucu çok-baytlı karakterleri bozmak • Aynı temizlik mantığını birçok sorguya kopyalamak; bunun yerine görünüm ya da fonksiyon kullanılmalı • Düzenli ifade gerektiren karmaşık desenleri SUBSTRING zincirleriyle çözmeye çalışmak
Bu beceriyi Mindset programlarında nerede çalışırsınız?
Mindset kataloğundaki SQL ile Veri Sorgulama (Temel) eğitimi, Filtreleme Teknikleri ve Temel Fonksiyonlar ile Koşullu İfadeler ve Değer Dönüşümleri modüllerini içerir; metin fonksiyonları bu başlıklara doğal olarak bağlanır. Pratik İş Raporları ile Sorgu Geliştirme modülü ise temizlenmiş veriden rapor üretmeyi uygulamaya taşır.
SQL ile Programlama Eğitimi Sorgular ile Hesaplamalar başlıklarını kapsar. Müşteri verisi, sipariş kayıtları ya da CRM çıktıları gibi düzensiz metin alanlarıyla çalışan raporlama ve operasyon ekipleri için bu başlıklar uygulamalı temel sağlar.
İlgili Mindset programı
SQL ile Veri Sorgulama (Temel)
Sık sorulan sorular
SUBSTRING ile LEFT arasındaki fark nedir?
LEFT yalnızca metnin başından belirli sayıda karakter alır, SUBSTRING ise herhangi bir konumdan başlayarak istenen uzunlukta bölüm döndürür. Başta sabit bir önek alıyorsanız LEFT daha okunaklıdır; ortadaki bir bölümü almak gerekiyorsa SUBSTRING kullanılır. Bu fonksiyonlar NULL girdiye NULL döndürür.
CONCAT neden bazen NULL döndürüyor?
Kullanılan birleştirme yöntemine bağlıdır. SQL Server'da + işareti bir parça NULL ise sonucu NULL yapar; CONCAT fonksiyonu ise NULL parçaları boş metin sayar. PostgreSQL'deki || işareti de NULL ile NULL üretir. Çözüm CONCAT ya da CONCAT_WS kullanmak veya parçaları COALESCE ile boş metne çevirmektir.
TRIM yalnızca boşlukları mı siler?
Varsayılan davranışta başta ve sondaki boşlukları siler. Bazı sistemler belirli karakterleri silme seçeneği de sunar. Satır sonu ya da sekme gibi görünmeyen karakterler boşluk sayılmayabilir; bu durumlarda REPLACE ile ilgili karakter kodları ayrıca temizlenir. Verinin kaynağındaki gizli karakterleri anlamak için uzunluk kontrolü yapılabilir.
SQL'de metin içinde arama nasıl yapılır?
Basit eşleşme için LIKE ve joker karakterler kullanılır. Konumu bulmak için CHARINDEX, LOCATE, INSTR ya da POSITION gibi sisteme özgü fonksiyonlar vardır. Karmaşık desenler için düzenli ifade desteği sistemden sisteme değişir; PostgreSQL ve MySQL bunu doğrudan sunar, SQL Server'da sınırlıdır.
Türkçe karakterlerde UPPER ve LOWER sorun çıkarır mı?
Çıkarabilir. İ, I, ı ve i harflerinin dönüşümü veritabanının harmanlama ve dil ayarına bağlıdır. Yanlış ayarlı bir sistemde LOWER işlemi İ harfini beklendiği gibi çevirmeyebilir. Eşleştirme yapıyorsanız harmanlama ayarını kontrol edin ve sonucu Türkçe karakter içeren birkaç örnekle test edin.
İlgili rehberler
İlgili eğitimler
Kategori: Veri Analitiği ve İş Zekası