Rakip sitelerden çektiğiniz ürün adlarında “Ayçiçek Yağı 5 Lt”, “AYÇİÇEK YAĞI 5L” ve “Ayçiçek yağı 5 lt.” aynı ürün. T-SQL’de bunu temizlemek için yıllarca iç içe CHARINDEX, SUBSTRING, PATINDEX ve REPLACE yazdık, ya da işi CLR’a veya Python’a devrettik. SQL Server 2025 ile bu dönem kapanıyor: T-SQL’in artık yerleşik düzenli ifade (regex) fonksiyonları var.
Bu yazıda yedi fonksiyonu, perakendeden gerçek örneklerle, performans ve Türkçe karakterlerle ilgili tuzaklarla birlikte anlatıyorum.
Hangi sürümlerde var?
Regex fonksiyonları SQL Server 2025 (17.x), Azure SQL Database, Azure SQL Managed Instance (SQL Server 2025 veya Always-up-to-date güncelleme politikasıyla) ve Fabric’teki SQL database’de kullanılabiliyor. SQL Server 2022 ve öncesinde yoklar.
Önemli bir ayrıntı: REGEXP_LIKE için veritabanı uyumluluk seviyesinin 170 olması gerekiyor. Diğer regex fonksiyonları her uyumluluk seviyesinde çalışıyor. Yükseltilmiş bir veritabanında REGEXP_LIKE hata veriyorsa önce buna bakın:
SELECT name, compatibility_level FROM sys.databases WHERE name = DB_NAME();
ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 170;
Uyumluluk seviyesini değiştirmek sorgu planlarını da etkileyebilir; üretimde önce test ortamında deneyin.
Yedi fonksiyon, tek bakışta
REGEXP_LIKE: Metin desene uyuyor mu?WHEREveCHECKiçinde kullanılır.REGEXP_COUNT: Desen metinde kaç kez geçiyor?REGEXP_INSTR: Eşleşmenin başladığı (ya da bittiği) konum.REGEXP_SUBSTR: Eşleşen parçayı döndürür.REGEXP_REPLACE: Eşleşen parçaları değiştirir.REGEXP_MATCHES: Her eşleşme için bir satır döndüren tablo fonksiyonu (CROSS APPLYile).REGEXP_SPLIT_TO_TABLE: Metni desene göre böler,valueveordinalsütunları döner.
Bayraklar (flags) da dört tane: i büyük/küçük harf duyarsız, c duyarlı (varsayılan), m çok satırlı mod, s noktanın satır sonunu da yakalaması.
Örnek 1: Ürün adından ambalaj bilgisini çıkarmak
Scraper’dan gelen ürün adlarından gramaj ve hacmi ayrı bir kolona almak, fiyat karşılaştırmasının ilk adımı:
SELECT urun_adi,
REGEXP_SUBSTR(urun_adi, '[0-9]+([.,][0-9]+)?\s?(kg|gr|g|lt|l|ml)', 1, 1, 'i') AS ambalaj
FROM dbo.RakipFiyat;
“Ayçiçek Yağı 5 Lt” için 5 Lt, “Beyaz Peynir 1,5 kg” için 1,5 kg döner. Alternatiflerin sırasına dikkat: kg‘yi g‘den, lt‘yi l‘den önce yazmazsanız desen kısa olanı yakalayıp bırakır.
Örnek 2: Metni temizlemek
Fazla boşlukları teke indirmek ve noktalama artıklarını atmak tek satır:
SELECT REGEXP_REPLACE(
REGEXP_REPLACE(urun_adi, '\s{2,}', ' '),
'[.]+$', '') AS temiz_ad
FROM dbo.RakipFiyat;
Eskiden aynı işi bir döngüyle ya da iç içe REPLACE zinciriyle yapıyorduk.
Örnek 3: Veri kalitesini tablo seviyesinde korumak
REGEXP_LIKE bir CHECK kısıtında kullanılabiliyor. Örneğin barkod kolonuna sadece 8 ya da 13 haneli sayısal değer girilsin:
ALTER TABLE dbo.Urun
ADD CONSTRAINT CK_Urun_Barkod
CHECK (REGEXP_LIKE(Barkod, '^[0-9]{8}([0-9]{5})?$'));
Bu, uygulama tarafındaki kontrolleri atlayan bir ETL ya da elle yapılan bir INSERT hatalı veriyi tabloya sokmadan durdurur. (Desen sadece biçimi kontrol eder; EAN kontrol hanesini doğrulamaz.)
Örnek 4: Sayma ve bölme
Bir ürün adında birden fazla sayı varsa (örneğin “6×1 L” gibi koliler) bunları tespit etmek:
SELECT urun_adi
FROM dbo.RakipFiyat
WHERE REGEXP_COUNT(urun_adi, '[0-9]+') > 1;
Ayraçları karışık bir listeyi satırlara bölmek:
SELECT value, ordinal
FROM REGEXP_SPLIT_TO_TABLE('Süt; Yoğurt,Peynir ;Ayran', '\s*[;,]\s*');
STRING_SPLIT tek bir ayraç karakteri kabul ederken burada noktalı virgül, virgül ve etraflarındaki boşluklar tek desende çözülüyor.
Performans: ne zaman index kullanılır?
Regex fonksiyonları satır satır çalışan, CPU tüketen fonksiyonlar. İki pratik kural:
- Desen
^ile başlıyorsaREGEXP_LIKEindex seek kullanabilir. Örneğin Türkiye’de üretilen ürünlerin barkod öneki 869 ile başlar;WHERE REGEXP_LIKE(Barkod, '^869')barkod index’ini kullanabilir. Baştaki^yoksa tablo taranır. - Ağır temizliği raporlama sorgusunda değil, yükleme sırasında yapın. Regex’i ETL’de bir kez çalıştırıp sonucu ayrı kolona yazmak, her rapor sorgusunda tekrar hesaplamaktan çok daha ucuz.
Satır tahmini yanlış çıkarsa SQL Server 2025’in kardinalite tahmini geri bildirimi REGEXP_LIKE sorgularındaki sapmaları algılayıp otomatik düzeltebiliyor. Elle müdahale için ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP ve ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP ipuçları da var.
Boyut sınırlarını da bilin: varchar(max) ve nvarchar(max) 2 MB’a kadar destekleniyor, desenin kendisi en fazla 8.000 bayt olabiliyor.
Türkçe için tuzak: regex collation’ı dinlemez
LIKE veritabanının collation kurallarına uyar; büyük/küçük harf duyarsız bir collation’da 'ı' ve 'I' gibi farkları kendisi yönetir. Regex fonksiyonları collation’ı dikkate almıyor ve varsayılan olarak büyük/küçük harfe duyarlı çalışıyor. Turkish_CI_AS bir veritabanında bile REGEXP_LIKE(ad, 'ayçiçek') “AYÇİÇEK” ile eşleşmez.
Çözüm 'i' bayrağı. Yine de Türkçedeki i/İ ve ı/I dönüşümlerinin her zaman beklediğiniz gibi çalışacağını varsaymayın; kritik eşleştirmelerde ya veriyi önceden normalize edin ya da deseni iki harfi de kapsayacak şekilde yazın (örneğin [iİ], [ıI]).
İkinci tuzak kısayol sınıfları. Motor RE2 tabanlı ve \w, \d, \s gibi sınıflar yalnızca ASCII karakterleri kapsıyor. Yani \w+ “Çikolata” kelimesindeki “Ç”yi, “Yoğurt”taki “ğ”yi yakalamaz. Türkçe metinde kelime ararken sınıfı açıkça yazın: [A-Za-zÇĞİÖŞÜçğıöşü0-9]+. RE2 ayrıca lookahead ve geri referansları (\1) desteklemiyor; başka platformlardan taşıdığınız desenleri test etmeden kullanmayın.
Bonus: bulanık eşleştirme (önizleme)
SQL Server 2025’te regex’in yanında bir de bulanık metin eşleştirme geldi: EDIT_DISTANCE, EDIT_DISTANCE_SIMILARITY, JARO_WINKLER_DISTANCE ve JARO_WINKLER_SIMILARITY. Rakip ürün adlarını kendi ürün kartlarınızla eşleştirmek için çok kullanışlılar. Ancak şu an önizlemede ve veritabanı düzeyinde açılması gerekiyor:
ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON;
SELECT r.urun_adi, u.UrunAdi,
EDIT_DISTANCE_SIMILARITY(r.urun_adi, u.UrunAdi) AS benzerlik
FROM dbo.RakipFiyat r
JOIN dbo.Urun u ON u.KategoriId = r.kategori_id
WHERE EDIT_DISTANCE_SIMILARITY(r.urun_adi, u.UrunAdi) >= 85;
Önizleme özelliklerini üretimde kullanmayın; ama bir eşleştirme prototipi için şimdiden denemeye değer. Regex ile önce ambalajı ve gürültüyü temizleyip sonra bulanık eşleştirme yapmak, ikisinin tek başına verdiği sonuçtan çok daha iyi çalışıyor.
Sonuç
SQL Server 2025’teki regex desteği küçük bir sözdizimi kolaylığı gibi görünse de veri temizliğinin nerede yapılacağını değiştiriyor: Python’a ya da CLR’a gitmeden, verinin durduğu yerde. Benim önerim şu: önce mevcut PATINDEX/REPLACE zincirlerinizin en karmaşık iki tanesini bulun ve regex ile yeniden yazın. Okunabilirlikteki fark tek başına yeterli bir sebep.
Siz T-SQL’de en çok hangi metin temizliği işiyle uğraşıyorsunuz?
Kaynaklar
- REGEXP_LIKE (Transact-SQL) – Microsoft Learn
- Fuzzy string matching overview – Microsoft Learn
- Regular expressions overview – Microsoft Learn
- Using RegEx in SQL Server 2025: Complete Guide – Redgate Simple Talk
HABERDAR OL
Yeni rehberler, kategorilere ayrılmış tek bir e-postada.
Her pazartesi, o hafta yayımlanan yazılar konu başlıklarına göre derlenmiş olarak gelen kutunda. Yeni yazı yoksa e-posta da yok.
