Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Azure Synapse Analytics
Analiz Platformu Sistemi (PDW)
Microsoft Fabric'teki SQL analiz uç noktası
Microsoft Fabric'teki ambar
Microsoft Fabric'teki SQL veritabanı
Bağımsız değişkenleri sırayla değerlendirir ve başlangıçta NULLolarak değerlendirilmeyen ilk ifadenin geçerli değerini döndürür. Aşağıdaki örnek, üçüncü değer null olmayan ilk değer olduğundan üçüncü değeri döndürür.
SELECT COALESCE(NULL, NULL, 'third_value', 'fourth_value');
Note
Dizeleri birleştirmek istiyorsanız bunun yerine STRING_AGG kullanın.
Transact-SQL söz dizimi kuralları
Syntax
COALESCE ( expression [ , ...n ] )
Arguments
expression
Herhangi bir türde ifadesi.
Dönüş türleri
En yüksek veri türü önceliğine sahip ifadesinin veri türünü döndürür. Tüm ifadeler null atanamazsa, sonuç null atanamaz olarak yazılır.
Remarks
Tüm bağımsız değişkenler NULLise COALESCENULLdöndürür. Null değerlerden en az biri türü NULLolmalıdır.
COALESCE ve CASE karşılaştırması
COALESCE ifadesi, CASE ifadesi için söz dizimsel bir kısayoldur. Yani, kod COALESCE(<expression1>, ...n) sorgu iyileştiricisi tarafından aşağıdaki CASE ifadesi olarak yeniden yazılır:
CASE
WHEN (expression1 IS NOT NULL) THEN expression1
WHEN (expression2 IS NOT NULL) THEN expression2
...
ELSE expressionN
END
Bu nedenle, giriş değerleri (ifade1, ifade2, expressionNvb.) birden çok kez değerlendirilir. Alt sorgu içeren bir değer ifadesi, belirsiz kabul edilir ve alt sorgu iki kez değerlendirilir. Bu sonuç SQL standardıyla uyumludur. Her iki durumda da, ilk değerlendirme ile yaklaşan değerlendirmeler arasında farklı sonuçlar döndürülebilir.
Örneğin, kod COALESCE((subquery), 1) yürütürken alt sorgu iki kez değerlendirilir. Sonuç olarak, sorgunun yalıtım düzeyine bağlı olarak farklı sonuçlar alabilirsiniz. Örneğin, kod çok kullanıcılı bir ortamda NULL yalıtım düzeyi altında READ COMMITTED döndürebilir. Kararlı sonuçların döndürülmesini sağlamak için SNAPSHOT ISOLATION yalıtım düzeyini kullanın veya COALESCEISNULL işleviyle değiştirin. Alternatif olarak, aşağıdaki örnekte gösterildiği gibi alt sorguyu bir alt seçime göndermek için sorguyu yeniden yazabilirsiniz:
SELECT CASE WHEN x IS NOT NULL THEN x ELSE 1 END
FROM (SELECT (SELECT Nullable
FROM Demo
WHERE SomeCol = 1) AS x) AS T;
COALESCE ve ISNULL karşılaştırması
ISNULL işlevi ve COALESCE ifadesi benzer bir amaca sahiptir ancak farklı davranabilir.
ISNULLbir işlev olduğundan yalnızca bir kez değerlendirilir. Daha önce açıklandığı gibi,COALESCEifadesi için giriş değerleri birden çok kez değerlendirilebilir.Sonuçta elde edilen ifadenin veri türü belirlemesi farklıdır.
ISNULLilk parametrenin veri türünü kullanır veCOALESCECASEifade kurallarını kullanarak en yüksek önceliğe sahip değer veri türünü döndürür.Sonuç ifadesinin NULLability değeri
ISNULLveCOALESCEiçin farklıdır. DönüşISNULLdeğeri her zaman null atanamaz olarak kabul edilir (dönüş değerinin null atanamaz olduğu varsayılır). Buna karşılık, null olmayan parametrelere sahipCOALESCENULLolarak kabul edilir. Bu nedenle ifadelerISNULL(NULL, 1)veCOALESCE(NULL, 1)eşit olsa da, farklı null atanabilirlik değerlerine sahiptir. Bu ifadeleri hesaplanan sütunlarda kullanıyorsanız, anahtar kısıtlamaları oluşturuyorsanız veya aşağıdaki örnekte gösterildiği gibi dizine alınabilmesi için skaler kullanıcı tanımlı işlevin (UDF) dönüş değerini belirleyici yapıyorsanız bu değerler bir fark yaratır:USE tempdb; GO -- This statement fails because the PRIMARY KEY cannot accept NULL values -- and the nullability of the COALESCE expression for col2 -- evaluates to NULL. CREATE TABLE #Demo ( col1 INT NULL, col2 AS COALESCE (col1, 0) PRIMARY KEY, col3 AS ISNULL(col1, 0) ); -- This statement succeeds because the nullability of the -- ISNULL function evaluates AS NOT NULL. CREATE TABLE #Demo ( col1 INT NULL, col2 AS COALESCE (col1, 0), col3 AS ISNULL(col1, 0) PRIMARY KEY );ISNULLveCOALESCEiçin doğrulamalar da farklıdır. Örneğin,NULLiçin birISNULLdeğeri içinCOALESCEdönüştürülür, ancak bir veri türü sağlamanız gerekir.ISNULLyalnızca iki parametre alır. Buna karşılıkCOALESCEdeğişken sayıda parametre alır.
Examples
Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.
A. Null olmayan bir değere sahip ilk sütundan veri döndürme
Aşağıdaki örnek, COALESCE null olmayan bir değere sahip ilk sütundaki verileri nasıl seçtiğini gösterir. Bu örnekte Products tablosunun şu verileri içerdiğini varsayalım:
Name Color ProductNumber
------------ ---------- -------------
Socks, Mens NULL PN1278
Socks, Mens Blue PN1965
NULL White PN9876
Ardından aşağıdaki COALESCE sorgusunu çalıştıracağız:
SELECT Name,
Color,
ProductNumber,
COALESCE (Color, ProductNumber) AS FirstNotNull
FROM Products;
Sonuç kümesi aşağıdadır.
Name Color ProductNumber FirstNotNull
------------ ---------- ------------- ------------
Socks, Mens NULL PN1278 PN1278
Socks, Mens Blue PN1965 Blue
NULL White PN9876 White
İlk satırda, FirstNotNull değeri PN1278değil Socks, Mensdeğeridir.
Name sütunu örnekteki COALESCE için parametre olarak belirtilmediğinden bu değer bu şekildedir.
B. Ücret tablosunda null olmayan değeri döndürme
Aşağıdaki örnekte, wages tablosu çalışanların yıllık ücretleri hakkında bilgi içeren üç sütun içerir: saatlik ücret, maaş ve komisyon. Ancak, bir çalışan yalnızca bir ödeme türü alır. Tüm çalışanlara ödenen toplam tutarı belirlemek için COALESCE kullanarak yalnızca hourly_wage, salaryve commissioniçinde bulunan null olmayan değeri alın.
SET NOCOUNT ON;
GO
USE tempdb;
IF OBJECT_ID('dbo.wages') IS NOT NULL
DROP TABLE wages;
GO
CREATE TABLE dbo.wages
(
emp_id TINYINT IDENTITY,
hourly_wage DECIMAL NULL,
salary DECIMAL NULL,
commission DECIMAL NULL,
num_sales TINYINT NULL
);
GO
INSERT dbo.wages (hourly_wage, salary, commission, num_sales)
VALUES (10.00, NULL, NULL, NULL),
(20.00, NULL, NULL, NULL),
(30.00, NULL, NULL, NULL),
(40.00, NULL, NULL, NULL),
(NULL, 10000.00, NULL, NULL),
(NULL, 20000.00, NULL, NULL),
(NULL, 30000.00, NULL, NULL),
(NULL, 40000.00, NULL, NULL),
(NULL, NULL, 15000, 3),
(NULL, NULL, 25000, 2),
(NULL, NULL, 20000, 6),
(NULL, NULL, 14000, 4);
GO
SET NOCOUNT OFF;
GO
SELECT CAST (COALESCE (hourly_wage * 40 * 52, salary, commission * num_sales) AS MONEY) AS 'Total Salary'
FROM dbo.wages
ORDER BY 'Total Salary';
GO
Sonuç kümesi aşağıdadır.
Total Salary
------------
10000.00
20000.00
20800.00
30000.00
40000.00
41600.00
45000.00
50000.00
56000.00
62400.00
83200.00
120000.00