Aracılığıyla paylaş


BIRLEŞME (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'teki SQL analiz uç noktasıMicrosoft Fabric'teki ambarMicrosoft 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.

  1. ISNULL bir işlev olduğundan yalnızca bir kez değerlendirilir. Daha önce açıklandığı gibi, COALESCE ifadesi için giriş değerleri birden çok kez değerlendirilebilir.

  2. Sonuçta elde edilen ifadenin veri türü belirlemesi farklıdır. ISNULL ilk parametrenin veri türünü kullanır ve COALESCECASE ifade kurallarını kullanarak en yüksek önceliğe sahip değer veri türünü döndürür.

  3. Sonuç ifadesinin NULLability değeri ISNULL ve COALESCEiçin farklıdır. Dönüş ISNULL değ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 ifadeler ISNULL(NULL, 1) ve COALESCE(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
    );
    
  4. ISNULL ve COALESCE için doğrulamalar da farklıdır. Örneğin, NULL için bir ISNULL değeri için COALESCE dönüştürülür, ancak bir veri türü sağlamanız gerekir.

  5. ISNULL yalnızca iki parametre alır. Buna karşılık COALESCE değ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