Kurs
Gerçek dünya verileriyle çalışırken eksik değerlere rastlamak neredeyse kaçınılmazdır. Veri setlerini temizlerken veya sütunları birleştirirken, SQL basit ama güçlü bir çözüm sunar: COALESCE() fonksiyonu. Bu öğreticide COALESCE() fonksiyonunun nasıl çalıştığını, ne zaman kullanmanız gerektiğini ve pratik örneklerle nasıl uygulayacağınızı—yalnızca birkaç satır SQL ile—göreceksiniz.
SQL'de COALESCE() Nedir?
SQL'deki COALESCE() fonksiyonu, bir ifade listesindeki ilk null olmayan değeri döndürür. Tüm değerler null ise null döner. Genellikle eksik değerleri ele almak veya birden fazla sütunu tek bir yedek çıktıda birleştirmek için kullanılır.
COALESCE() Ne Zaman Kullanılmalı?
Bu fonksiyon, birden çok sütundaki değerleri tek bir değerde birleştirmeniz gerektiğinde kullanışlıdır.
Örneğin, users adlı bir tabloda kullanıcıların work_email ve personal_email değerleri bulunur.
COALESCE() fonksiyonunu kullanarak, null değilse kullanıcının work_email adresini gösteren, aksi halde personal_email adresini gösteren email adlı bir sütun oluşturabiliriz.
|
|
|
|
|
|
1 |
angel@datacamp.com |
null |
angel@datacamp.com |
|
2 |
null |
bruce@gmail.com |
bruce@gmail.com |
|
3 |
cath@datacamp.com |
cath@gmail.com |
cath@datacamp.com |
COALESCE() Söz Dizimi
COALESCE(value_1, value_2, ...., value_n)
COALESCE() fonksiyonu en az bir değer (value_1) alır. Soldan sağa doğru listede ilk null olmayan değeri döndürür.
Örneğin, önce value_1 değerinin null olup olmadığını kontrol eder. Değilse value_1 değerini döndürür. Aksi halde value_2 değerinin null olup olmadığına bakar. Bu süreç liste tamamlanana kadar devam eder.
COALESCE(), sütunlar, ifadeler veya sabitlerle kullanılabilir.
COALESCE() için Pratik Örnekler
Bu eğitimdeki kodu çevrimiçi olarak çalıştırın ve düzenleyin
Kodu çalıştırÖrnek 1: null değerleri bir sabitle değiştirme
countries tablosunda ülkeler ve ulusal günlerinin listesi olduğunu düşünün. Bazı ulusal gün değerleri null. COALESCE(), national_day içindeki eksik değerleri 'Unknown' sabit dizesiyle doldurur.
SELECT
country_id,
name,
national_day,
COALESCE(national_day, 'Unknown') AS national_day_coalesced
FROM countries
ORDER BY country_id
Sonuçlar şu şekildedir:
|
|
|
|
|
|
1 |
Aruba |
null |
Unknown |
|
2 |
Afghanistan |
1919-08-19T00:00:00.000Z |
1919-08-19 |
|
3 |
Angola |
1975-11-11T00:00:00.000Z |
1975-11-11 |
|
4 |
Anguilla |
1967-05-30T00:00:00.000Z |
1967-05-30 |
national_day içindeki null değerin sabit Unknown ile nasıl değiştirildiğine dikkat edin.
Örnek 2: İki sütun arasında seçim yapmak
products adlı bir tablomuz var. Ürün adını ve açıklamasını içeriyor. Bazı açıklamalar çok uzun (60 karakterden fazla). Bu durumda açıklamayı ürün adıyla değiştiriyoruz.
Aşağıdaki sorgu, uzun açıklamaları CASE ile NULL'a dönüştürüyor, ardından COALESCE() kullanarak ürün adına geri dönüyor.
SELECT DISTINCT
product_name,
description,
COALESCE(
CASE WHEN
LENGTH(description) >= 60
THEN NULL
ELSE description
END,
product_name) product_name_or_description
FROM products
Sonuçlar şu şekildedir:
product_name |
|
|
|
G.Skill Ripjaws V Series |
"Speed:DDR4-3200,Type:288-pin DIMM,CAS:14Module:4x16GBSize:64GB" |
G.Skill Ripjaws V Series |
|
G.Skill Ripjaws V Series |
"Speed:DDR4-3200,Type:288-pin DIMM,CAS:15Module:4x16GBSize:64GB" |
G.Skill Ripjaws V Series |
|
Asus X99-E-10G WS |
"CPU:LGA2011-3,Form Factor:SSI CEB,RAM Slots:8,Max RAM:128GB" |
"CPU:LGA2011-3,Form Factor:SSI CEB,RAM Slots:8,Max RAM:128GB" |
|
Supermicro X9SRH-7TF |
"CPU:LGA2011,Form Factor:ATX,RAM Slots:8,Max RAM:64GB" |
"CPU:LGA2011,Form Factor:ATX,RAM Slots:8,Max RAM:64GB" |
product_name_or_description sütununun, description uzun olduğunda product_name değerini; aksi halde description değerini nasıl gösterdiğine dikkat edin.
Örnek 3: Birden fazla sütunla geri dönüş mantığı
Örnek 2'yi bir adım daha ileri taşıyabiliriz. Şu anda iki gereksinim olduğunu varsayalım:
descriptionuzunluğu 60'tan azsadescriptiongörüntülensin.- Aksi halde,
product_nameuzunluğu 20'den az mı diye kontrol edin. Öyleyseproduct_namegörüntülensin. - Aksi halde
productgörüntülensin.
SELECT DISTINCT
product_name,
description,
COALESCE(
CASE
WHEN LENGTH(description) > 50
THEN NULL
ELSE description
END,
CASE
WHEN LENGTH(product_name) > 14
THEN NULL
ELSE product_name
END,
'product') AS product_name_or_description
FROM products
ORDER BY product_name
Sonuçlar şu şekildedir:
|
|
|
|
|
ADATA ASU800SS-128GT-C |
Series:Ultimate SU800,Type:SSD,Capacity:128GB,Cache:N/A |
product |
|
ADATA ASU800SS-512GT-C |
Series:Ultimate SU800,Type:SSD,Capacity:512GB,Cache:N/A |
product |
|
AMD 100-5056062 |
Chipset:Vega Frontier Edition Liquid,Memory:16GBCore Clock:1.5GHz |
product |
|
AMD 100-505989 |
Chipset:FirePro W9100,Memory:32GBCore Clock:930MHz |
Chipset:FirePro W9100,Memory:32GBCore Clock:930MHz |
product_name_or_description sütununun, product_name veya description uzunluklarına bağlı olarak product_name ya da description gösterdiğine dikkat edin.
Desteklenen SQL Motorları
COALESCE(), SQL Server (2008'den itibaren), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse, BigQuery ve Amazon RedShift'te çalışır.
İlgili SQL Fonksiyonları
Son Düşünceler
COALESCE() fonksiyonu, null değerleri ele almak ve SQL sorgularınızı sadeleştirmek için çok yönlü bir araçtır. Eksik verileri varsayılanlarla değiştirirken veya birden fazla sütunu tek bir sütunda birleştirirken, COALESCE() mantığınızı temiz ve okunaklı tutmaya yardımcı olur.
SQL becerilerinizi derinleştirmeye hazır mısınız? DataCamp'teki başlangıç seviyesine uygun ve kariyerinizi destekleyen şu kurslara göz atın:
SSS
COALESCE() içindeki tüm değerler NULL ise ne olur?
COALESCE() fonksiyonuna geçirilen tüm argümanlar NULL ise, fonksiyon NULL döndürür.
COALESCE(), ISNULL() veya IFNULL()'dan nasıl farklıdır?
ISNULL()(SQL Server) veIFNULL()(MySQL, SQLite) yalnızca iki argüman kabul eder.-
COALESCE()birden fazla argüman kabul edebilir ve SQL diyalektleri arasında daha standarttır. -
COALESCE()ANSI SQL standardının bir parçasıdır;ISNULL()veIFNULL()ise veritabanına özeldir.
COALESCE()'i ifadeler veya fonksiyonlarla kullanabilir miyim?
Evet, COALESCE() içinde sütun adları, sabitler, fonksiyonlar veya ifadeler kullanabilirsiniz.
COALESCE(LOWER(name), 'unknown')COALESCE() kullanmanın bir performans maliyeti var mı?
Genel olarak hayır—COALESCE() etkilidir. Ancak, karmaşık ifadelerle veya büyük sorgular içinde kullanırsanız, yazım şekline bağlı olarak veritabanı gerekenden fazla ifadeyi değerlendirebilir.
COALESCE() farklı veri tipleriyle çalışır mı?
Evet, ancak tüm argümanlar örtük olarak ortak bir veri tipine dönüştürülebilir olmalıdır. Aksi halde, SQL motorunuza bağlı olarak tipi dönüştürme hatası dönebilir.
COALESCE() fonksiyonlarını iç içe kullanabilir miyim?
Evet, iç içe kullanabilirsiniz; ancak COALESCE() zaten birden çok argümanı ele aldığı için buna nadiren ihtiyaç vardır:
COALESCE(col1, COALESCE(col2, 'default'))
Bu, şuna eşdeğerdir:
COALESCE(col1, col2, 'default')