# PostgreSQL’de string_agg ile Benzersiz Değerleri Birleştirme
PostgreSQL veritabanınızda birden çok satırdaki verileri tek bir satıra, virgülle ayrılmış bir string olarak birleştirmeniz gerekiyor mu? Örneğin, bir müşterinin sipariş verdiği tüm ürünleri tek bir alanda göstermek mi istiyorsunuz? İşte tam burada string_agg fonksiyonu devreye giriyor. Ancak, aynı ürünü birden fazla sipariş etmiş bir müşteri için tekrar eden değerleri engellemek istiyorsanız, işler biraz daha karmaşıklaşıyor. Bu makalede, PostgreSQL’de string_agg fonksiyonunu benzersiz değerlerle nasıl kullanacağınızı adım adım, gerçek dünya örnekleriyle ve performans optimizasyon teknikleriyle öğreneceksiniz.
Öğrenme Yol Haritası:
* Yeni Başlayan: string_agg‘in temel kullanımını ve basit örnekleri.
* Orta Seviye: Gerçek dünya senaryoları, performans ipuçları ve daha gelişmiş kullanım örnekleri.
* İleri Seviye: Performans analizi, sınır durumları (edge cases) ve karmaşık sorgularda string_agg‘in kullanımı.
PostgreSQL’de string_agg Fonksiyonu Nedir?
string_agg fonksiyonu, bir gruptaki değerleri tek bir string halinde birleştirmenizi sağlar. Birleştirme işlemi sırasında, her değeri belirlediğiniz bir ayırıcı ile birbirinden ayırır. Örneğin, virgül, boşluk veya tire kullanabilirsiniz. Bu fonksiyon, genellikle GROUP BY cümleciği ile birlikte kullanılır. Temel yapısı şu şekildedir:
string_agg(column, delimiter)
Burada column birleştirmek istediğiniz sütun, delimiter ise değerler arasına eklenecek ayırıcıdır.
string_agg ile Benzersiz Değerleri Birleştirme: Temel Kullanım
Yeni başlayanlar için, string_agg fonksiyonunu benzersiz değerlerle kullanmanın en basit yolu, DISTINCT anahtar kelimesini kullanmaktır. Aşağıdaki örnekte, her müşterinin sipariş verdiği *benzersiz* ürünleri birleştiriyoruz:
Örnek Veri Tabanı (Ürünler Tablosu):
| MüşteriID | ÜrünAdı |
|—|—|
| 1 | Elma |
| 1 | Armut |
| 1 | Elma |
| 2 | Portakal |
| 2 | Muz |
| 2 | Portakal |
SQL Sorgusu:
SELECT
MüşteriID,
string_agg(DISTINCT ÜrünAdı, ', ') AS SiparişEdilenÜrünler
FROM
Ürünler
GROUP BY
MüşteriID;
Sonuç:
| MüşteriID | SiparişEdilenÜrünler |
|—|—|
| 1 | Elma, Armut |
| 2 | Portakal, Muz |
Gördüğünüz gibi, her müşteri için aynı ürün sadece bir kez listelenmiştir.
string_agg ile Benzersiz Değerleri Birleştirme: Gerçek Dünya Örneği ve Optimizasyon İpuçları
Şimdi, daha gerçekçi bir senaryoya bakalım. Bir e-ticaret sitesinin ürün kategorilerini ve her kategorideki benzersiz ürün sayısını listeleyelim. Bu örnekte, önce her kategorideki benzersiz ürün adlarını birleştireceğiz, sonra bu listeyi kullanarak her kategorideki ürün sayısını hesaplayacağız.
Örnek Veri Tabanı (Ürünler Tablosu):
| ÜrünID | ÜrünAdı | Kategori |
|—|—|—|
| 1 | Ayakkabı 1 | Ayakkabı |
| 2 | Ayakkabı 2 | Ayakkabı |
| 3 | Elbise 1 | Giyim |
| 4 | Elbise 2 | Giyim |
| 5 | Ayakkabı 1 | Ayakkabı |
| 6 | Pantolon 1 | Giyim |
SQL Sorgusu:
WITH BenzersizUrunler AS (
SELECT
Kategori,
string_agg(DISTINCT ÜrünAdı, ', ') as Urunler
FROM
Ürünler
GROUP BY
Kategori
)
SELECT
Kategori,
Urunler,
COUNT(DISTINCT ÜrünAdı) OVER (PARTITION BY Kategori) as UrunSayisi
FROM
BenzersizUrunler;
Bu sorgu, önce bir CTE (Common Table Expression) kullanarak her kategori için benzersiz ürün adlarını birleştirir. Ardından, bu CTE’yi kullanarak her kategorideki benzersiz ürün sayısını hesaplar. Bu yaklaşım, okunabilirliği ve performansı artırır. Büyük veri kümeleri için indeksleme (örneğin, ÜrünAdı ve Kategori sütunlarına indeks eklemek) performansı önemli ölçüde iyileştirebilir.
İleri Düzey Kullanım: Performans Analizi ve Sınır Durumları
Çok büyük veri kümeleriyle çalışırken, string_agg performansı etkileyebilir. Bu durumda, aşağıdaki optimizasyon tekniklerini kullanabilirsiniz:
* Parçalama (Partitioning): Veri tabanınızı kategorilere göre bölümlere ayırmak, string_agg işlemini daha küçük veri kümeleri üzerinde çalıştırmanıza olanak tanır ve performansı artırır.
* İndeksler: string_agg fonksiyonunda kullanılan sütunlara indeks eklemek, sorgunun yürütülme süresini kısaltabilir.
* Alternatif Yaklaşımlar: Çok büyük veri kümeleri için, string_agg yerine daha performanslı alternatifler düşünebilirsiniz. Örneğin, verileri öncelikle birleştirme işlemini gerçekleştirmek için bir programlama dili kullanarak işleyebilir ve daha sonra sonucu veritabanına kaydedebilirsiniz. Bu, veritabanı sunucusundaki yükü azaltır.
Sınır Durumları:
* Boş Değerler: string_agg fonksiyonu, boş değerleri varsayılan olarak yoksayar. Boş değerleri dahil etmek istiyorsanız, NULL değerlerini bir string’e dönüştürmeniz gerekir (örneğin, COALESCE(ÜrünAdı, 'Bilinmiyor')).
* Çok Büyük Stringler: string_agg sonucu çok büyük bir string olabilir. Bu durumda, veritabanı sunucunuzun bellek sınırlamalarına dikkat etmeniz gerekir. Gerekirse, sonuçları daha küçük parçalara bölerek işleyebilirsiniz.
PostgreSQL’de string_agg ile İlgili Sıkça Sorulan Sorular (SSS)
1. string_agg fonksiyonu hangi veri tiplerini destekler? string_agg fonksiyonu, text veri tipiyle çalışır. Diğer veri tiplerini kullanmanız gerekiyorsa, öncelikle bunları text veri tipine dönüştürmeniz gerekir.
2. string_agg fonksiyonu büyük veri kümeleri için yavaşsa ne yapabilirim? Yukarıda belirtildiği gibi, parçalama, indeksleme ve alternatif yaklaşımları deneyebilirsiniz. Ayrıca, sorguyu optimize etmek için EXPLAIN ANALYZE komutunu kullanarak sorgu planını inceleyebilirsiniz.
3. string_agg fonksiyonu ile oluşturulan string’in uzunluğu sınırlı mıdır? Evet, PostgreSQL’de bir string’in maksimum uzunluğu vardır. Çok büyük stringler oluşturmaya çalışıyorsanız, verileri daha küçük parçalara bölmeniz gerekebilir.
4. string_agg fonksiyonu ile sıralı bir birleştirme nasıl yapılır? ORDER BY cümleciğini kullanarak birleştirme işlemini sıralayabilirsiniz. Örneğin: string_agg(DISTINCT ÜrünAdı ORDER BY ÜrünAdı, ', ').
5. string_agg fonksiyonu yerine başka bir fonksiyon kullanabilir miyim? Bazı durumlarda, array_agg fonksiyonu daha uygun olabilir. array_agg fonksiyonu, bir dizi döndürür ve bazı durumlarda string_agg‘den daha performanslı olabilir.
Sonuç
Bu makalede, PostgreSQL’de string_agg fonksiyonunu benzersiz değerlerle nasıl kullanacağınızı, gerçek dünya örnekleriyle ve performans optimizasyon teknikleriyle öğrendiniz. Başlangıç seviyesinden ileri seviyeye kadar olan yolculuğunuzda, doğru teknikleri kullanarak verilerinizi etkili bir şekilde birleştirebilirsiniz. Daha fazla PostgreSQL ipucu ve teknikleri için [fatihsoysal.com](https://fatihsoysal.com) adresini ziyaret edebilirsiniz.
Yazar: Fatih Soysal
