Ana içeriğe geç
Kesit SQL
Temel · Fonksiyonlar

NULL güvenli karşılaştırma: IS DISTINCT FROM ve eşdeğerleri

“Eşit değil” koşulu NULL satırları neden kaçırır; iki değeri NULL dahil doğru karşılaştırmanın yolları.

Uygulamada aç, 6 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Sorun: <> NULL'ı görmez

raw_signups tablosunda şehri “İstanbul” olmayan kayıtları saymak istiyorsun:

SELECT COUNT(*) AS adet
FROM raw_signups
WHERE city <> 'İstanbul';

Şehri NULL olan iki kayıt bu sayıya girmez. Çünkü NULL <> 'İstanbul' sonucu doğru değil bilinmiyordur ve WHERE yalnızca doğru olan satırları geçirir. İş kuralı “İstanbul dışındaki herkes” ise NULL satırlar da sayılmalıdır.

Taşınabilir çözüm

SELECT COUNT(*) AS adet
FROM raw_signups
WHERE city <> 'İstanbul' OR city IS NULL;

Her SQL türünde çalışır. İki sütunu karşılaştırırken (örneğin eski ve yeni değer) yazım uzar:

WHERE (a <> b) OR (a IS NULL AND b IS NOT NULL) OR (a IS NOT NULL AND b IS NULL)

IS DISTINCT FROM

SQL standardı bu karşılaştırma için ayrı bir operatör tanımlar. a IS DISTINCT FROM b, NULL'ı sıradan bir değer gibi ele alır:

aba <> ba IS DISTINCT FROM b
12doğrudoğru
11yanlışyanlış
1NULLbilinmiyordoğru
NULLNULLbilinmiyoryanlış

Tersi IS NOT DISTINCT FROM'dur: iki NULL'ı da “eşit” sayar.

SQL türü“Farklı mı?” (NULL dahil)“Aynı mı?” (NULL dahil)
PostgreSQL, BigQuery, SQL Server 2022+a IS DISTINCT FROM ba IS NOT DISTINCT FROM b
MySQLNOT (a <=> b)a <=> b (NULL güvenli eşitlik)
OracleDECODE(a, b, 0, 1) = 1 (DECODE iki NULL'ı eşit sayar)DECODE(a, b, 1, 0) = 1
SQLitea IS NOT ba IS b
Nerede işe yarar?Veri mühendisliğinde “hangi satırlar değişti?” sorusu: kaynak ve hedefteki değerleri karşılaştırırken eski değer NULL, yeni değer dolu ise satır değişmiş sayılmalıdır. <> bu değişikliği kaçırır.
Alıştırmalara geç (6)