Przejdź do treści
Powrót do Centrum Pomocy
Ilustracja artykułu: Sql server coalesce — kompletny przewodnik 2026
Aplikacje Microsoft

Sql server coalesce — kompletny przewodnik 2026

W 2026 roku COALESCE pozostaje standardowym i bezpiecznym elementem pracy z Microsoft SQL Server, w tym SQL Server 2022, Azure SQL Database oraz środowiskami ur

17 min czytania·Zaktualizowano dzisiaj
Autor:Piotr ZielińskiSprawdzone przezKatarzyna NowakAktualizacja: 9 czerwca 2026
Faktura VAT 23% + KSeFDostawa 1-3 min e-mailemGwarancja działania klucza5,0 / 5,0(KluczeSoft)

SQL Server COALESCE to funkcja języka T-SQL, która zwraca pierwszą wartość różną od NULL z podanej listy wyrażeń. W praktyce jest jednym z najczęściej używanych narzędzi do obsługi brakujących danych w zapytaniach, raportach, procedurach składowanych i widokach. Jeżeli kolumna z numerem telefonu jest pusta, można pokazać numer alternatywny. Jeżeli cena promocyjna nie istnieje, można wyświetlić cenę standardową. Jeżeli pole z nazwą firmy ma NULL, można zastąpić je nazwą osoby fizycznej albo tekstem zastępczym.

W 2026 roku COALESCE pozostaje standardowym i bezpiecznym elementem pracy z Microsoft SQL Server, w tym SQL Server 2022, Azure SQL Database oraz środowiskami uruchamianymi na Windows Server 2025. Jest szczególnie ważny w firmowych systemach ERP, CRM, e-commerce, raportowaniu finansowym, integracjach z Power BI i aplikacjach pracujących na dużych zbiorach danych. Trzeba jednak pamiętać, że COALESCE nie jest tylko „ładniejszym ISNULL”. Ma inne zasady typowania, może wpływać na optymalizator zapytań, a w niektórych przypadkach może zwracać wynik inny, niż oczekuje programista.

Dla firm, które kupują lub modernizują środowisko bazodanowe, znajomość COALESCE ma wymiar praktyczny: poprawia jakość raportów, ogranicza błędy w aplikacjach i pomaga uniknąć kosztownych problemów przy migracji danych. Jeżeli planujesz wdrożenie lub odnowienie licencji SQL Server, warto równolegle uporządkować zapytania T-SQL i standardy obsługi NULL.

Co robi COALESCE w SQL Server?

COALESCE zwraca pierwsze wyrażenie z listy, które nie ma wartości NULL. Składnia jest prosta:

COALESCE(wyrażenie1, wyrażenie2, wyrażenie3, ...)

SQL Server sprawdza argumenty od lewej do prawej. Gdy znajdzie pierwszą wartość różną od NULL, zwraca ją jako wynik. Jeżeli wszystkie argumenty są NULL, wynik również będzie NULL.

Przykład:

SELECT COALESCE(NULL, NULL, 'Warszawa', 'Kraków') AS Miasto;

Wynik:

Warszawa

W zapytaniach biznesowych najczęściej wygląda to tak:

SELECT
    CustomerID,
    COALESCE(PhoneMobile, PhoneOffice, PhoneHome, 'brak telefonu') AS KontaktTelefoniczny
FROM Customers;

Jeżeli klient ma numer komórkowy, zostanie wyświetlony numer komórkowy. Jeżeli go nie ma, SQL Server sprawdzi numer biurowy. Jeżeli ten również jest pusty, sprawdzi numer domowy. Dopiero na końcu pokaże tekst brak telefonu.

Najważniejsze zastosowania COALESCE:

  • zastępowanie wartości NULL tekstem, liczbą lub datą domyślną,
  • wybieranie pierwszej dostępnej wartości z kilku kolumn,
  • budowanie etykiet i opisów w raportach,
  • porządkowanie danych przed eksportem do systemów zewnętrznych,
  • łączenie danych z różnych źródeł, gdy nie wszystkie pola są wypełnione,
  • upraszczanie logiki CASE, gdy warunek dotyczy tylko wartości NULL.

Przykład z systemu sprzedażowego:

SELECT
    OrderID,
    COALESCE(DiscountPrice, RegularPrice) AS CenaDoFaktury
FROM Orders;

Jeżeli zamówienie ma cenę rabatową, raport użyje ceny rabatowej. Jeżeli nie, użyje ceny regularnej. Taki zapis jest krótki, czytelny i łatwy do utrzymania.

Ważne: COALESCE nie zmienia danych w tabeli. Działa tylko na wyniku zapytania, chyba że zostanie użyty w instrukcji UPDATE, INSERT, kolumnie obliczeniowej albo widoku materializowanym w dalszej logice aplikacji.

NULL w SQL Server — dlaczego COALESCE jest tak potrzebny?

Aby poprawnie używać COALESCE, trzeba rozumieć, czym jest NULL. W SQL Server NULL oznacza brak znanej wartości, a nie zero, pusty tekst ani fałsz. To jedna z najczęstszych przyczyn błędów w zapytaniach.

Przykład:

SELECT 10 + NULL AS Wynik;

Wynik to NULL, nie 10. Jeżeli jedna część działania jest nieznana, cały wynik również staje się nieznany.

Podobnie w konkatenacji:

SELECT FirstName + ' ' + LastName AS FullName
FROM Employees;

Jeżeli LastName ma NULL, wynik całego wyrażenia może być NULL, zależnie od ustawień i sposobu użycia operatorów. W raportach oznacza to puste pola, mimo że część danych istnieje.

COALESCE rozwiązuje takie problemy:

SELECT
    COALESCE(FirstName, '') + ' ' + COALESCE(LastName, '') AS FullName
FROM Employees;

W bazach firmowych NULL pojawia się z wielu powodów:

  • klient nie podał danych kontaktowych,
  • produkt nie ma jeszcze ceny promocyjnej,
  • zamówienie nie zostało przypisane do opiekuna,
  • dokument nie został jeszcze zaksięgowany,
  • integracja API nie przesłała wszystkich pól,
  • tabela została rozszerzona o nową kolumnę, ale stare rekordy jej nie mają,
  • migracja z poprzedniego systemu ERP nie zawierała pełnego zestawu danych.

W praktyce NULL nie jest błędem samym w sobie. Błędem jest brak świadomej obsługi NULL w zapytaniach. Szczególnie w raportach finansowych, sprzedażowych i magazynowych różnica między NULL, 0 i pustym tekstem ma znaczenie biznesowe.

Przykład:

SELECT
    ProductID,
    StockQuantity,
    COALESCE(ReservedQuantity, 0) AS ReservedQuantity,
    StockQuantity - COALESCE(ReservedQuantity, 0) AS AvailableQuantity
FROM Inventory;

Jeżeli ReservedQuantity jest NULL, firma zwykle chce traktować to jako brak rezerwacji, czyli 0. Bez COALESCE wynik dostępnej ilości również byłby NULL, co mogłoby zaburzyć raport stanów magazynowych.

W systemach księgowych i sprzedażowych takie drobne błędy szybko przenoszą się na decyzje: błędne zamówienia, niepełne raporty VAT, niepoprawne eksporty do narzędzi analitycznych czy problemy z integracją w kontekście KSeF. Dlatego w dobrze utrzymywanych środowiskach SQL Server obsługa NULL jest częścią standardu kodowania.

Składnia i przykłady użycia SQL Server COALESCE

Podstawowa składnia funkcji jest uniwersalna:

COALESCE(expression1, expression2, ..., expressionN)

Każdy argument może być kolumną, literałem, funkcją, wynikiem podzapytania albo wyrażeniem obliczeniowym. Wszystkie argumenty muszą jednak dać się sprowadzić do zgodnego typu danych zgodnie z zasadami pierwszeństwa typów w SQL Server.

Zastępowanie pustej wartości tekstem

SELECT
    CustomerName,
    COALESCE(TaxId, 'brak NIP') AS NIP
FROM Customers;

Jeżeli TaxId jest NULL, wynik pokaże brak NIP. To popularne w raportach, eksportach CSV i widokach dla aplikacji.

Wybór pierwszego dostępnego adresu e-mail

SELECT
    CustomerID,
    COALESCE(EmailBusiness, EmailPrivate, EmailBilling, 'brak adresu e-mail') AS EmailKontaktowy
FROM Customers;

Ten zapis porządkuje logikę kontaktu: najpierw adres firmowy, potem prywatny, potem fakturowy, a na końcu komunikat zastępczy.

Domyślna data

SELECT
    InvoiceID,
    COALESCE(PaymentDate, DueDate) AS DataRozliczenia
FROM Invoices;

Jeżeli faktura została zapłacona, pokazujemy datę płatności. Jeżeli nie, pokazujemy termin płatności. W raportach należności to bardzo częsty scenariusz.

Użycie w UPDATE

COALESCE jest przydatny także przy aktualizacji danych, na przykład gdy chcemy uzupełnić pole tylko wtedy, gdy nowa wartość nie jest NULL.

UPDATE Customers
SET
    Phone = COALESCE(@NewPhone, Phone),
    Email = COALESCE(@NewEmail, Email)
WHERE CustomerID = @CustomerID;

Jeżeli parametr @NewPhone jest NULL, stary numer telefonu pozostaje bez zmian. To wygodne w procedurach składowanych aktualizujących tylko część danych.

Użycie w filtrowaniu

Trzeba zachować ostrożność, ale COALESCE bywa używany w warunkach:

SELECT *
FROM Orders
WHERE COALESCE(Status, 'NEW') = 'NEW';

Zapytanie zwróci zamówienia ze statusem NEW oraz te, których status jest NULL. W raportach jest to czytelne, ale w dużych tabelach może wpłynąć na wykorzystanie indeksów. Zwykle wydajniejszy zapis to:

WHERE Status = 'NEW' OR Status IS NULL

Użycie w ORDER BY

SELECT
    ProductName,
    LastSoldDate
FROM Products
ORDER BY COALESCE(LastSoldDate, '19000101') DESC;

Wartości NULL zostaną potraktowane jako bardzo stara data, dzięki czemu produkty nigdy niesprzedane spadną na koniec listy.

Użycie z funkcjami agregującymi

SELECT
    CategoryID,
    SUM(COALESCE(SalesAmount, 0)) AS TotalSales
FROM Sales
GROUP BY CategoryID;

Funkcje agregujące, takie jak SUM, same ignorują NULL, ale COALESCE bywa przydatny, gdy dalsze obliczenia wymagają jawnego zera.

Przykład w raporcie sprzedażowym

SELECT
    s.OrderID,
    c.CustomerName,
    COALESCE(c.TaxId, 'brak NIP') AS NIP,
    COALESCE(s.DiscountAmount, 0) AS Rabat,
    s.TotalAmount - COALESCE(s.DiscountAmount, 0) AS KwotaPoRabacie
FROM SalesOrders s
JOIN Customers c ON c.CustomerID = s.CustomerID;

To typowy przykład z systemu handlowego: dane klienta, rabat i kwota końcowa muszą być czytelne, nawet gdy część pól jest niewypełniona.

COALESCE a ISNULL, CASE i NULLIF — porównanie

W SQL Server najczęściej porównuje się COALESCE z ISNULL. Obie konstrukcje mogą zastąpić NULL, ale nie są identyczne. Dodatkowo COALESCE jest logicznie zbliżony do wyrażenia CASE, ponieważ SQL Server przetwarza go w podobny sposób.

Funkcja lub konstrukcjaGłówne zastosowanieLiczba argumentówStandard SQLTypowe ryzyko
COALESCEZwraca pierwszą wartość nie-NULL2 lub więcejTaktyp wyniku zależy od pierwszeństwa typów
ISNULLZastępuje jedną wartość NULL2Nie, funkcja T-SQLtyp wyniku zwykle wynika z pierwszego argumentu
CASEPełna logika warunkowawiele warunkówTakbardziej rozbudowany kod
NULLIFZwraca NULL, gdy dwie wartości są równe2Takwymaga późniejszej obsługi NULL

Przykład ISNULL:

SELECT ISNULL(Phone, 'brak telefonu') AS Phone
FROM Customers;

Przykład COALESCE:

SELECT COALESCE(PhoneMobile, PhoneOffice, PhoneHome, 'brak telefonu') AS Phone
FROM Customers;

Jeżeli masz tylko jedną kolumnę i jedną wartość zastępczą, ISNULL bywa wystarczający. Jeżeli masz kilka możliwych źródeł danych, COALESCE jest naturalniejszy i bardziej przenośny.

Najważniejsza różnica dotyczy typów danych. SQL Server wybiera typ wyniku COALESCE według zasad pierwszeństwa typów, natomiast ISNULL często przyjmuje typ pierwszego argumentu. To może prowadzić do niespodzianek.

Przykład:

DECLARE @x VARCHAR(5) = NULL;

SELECT ISNULL(@x, 'dłuższy tekst') AS Wynik;

Wynik może zostać obcięty do długości VARCHAR(5), ponieważ pierwszy argument ma taki typ. W przypadku COALESCE zasady mogą być inne, zależnie od typów i długości argumentów, ale nadal należy jawnie kontrolować typy, zwłaszcza w raportach i eksportach.

Bezpieczny zapis:

SELECT COALESCE(CAST(@x AS VARCHAR(50)), 'dłuższy tekst') AS Wynik;

COALESCE można też zastąpić przez CASE:

CASE
    WHEN PhoneMobile IS NOT NULL THEN PhoneMobile
    WHEN PhoneOffice IS NOT NULL THEN PhoneOffice
    ELSE 'brak telefonu'
END

Taki zapis jest dłuższy, ale czasami bardziej czytelny, szczególnie gdy warunki nie dotyczą tylko NULL.

NULLIF działa odwrotnie niż COALESCE w wielu scenariuszach. Przykład:

SELECT COALESCE(NULLIF(TaxId, ''), 'brak NIP') AS TaxId
FROM Customers;

NULLIF(TaxId, '') zamienia pusty tekst na NULL, a COALESCE zastępuje go komunikatem. To przydatne, bo w wielu bazach po migracji występują jednocześnie NULL i puste stringi.

W praktyce decyzja wygląda następująco:

ScenariuszNajlepszy wybór
Jedna kolumna i jedna wartość domyślnaISNULL lub COALESCE
Kilka możliwych kolumn źródłowychCOALESCE
Warunki bardziej złożone niż NULL / nie-NULLCASE
Zamiana pustego tekstu lub zera na NULLNULLIF
Kod zgodny ze standardem SQLCOALESCE

Dla nowych projektów T-SQL dobrym standardem jest używanie COALESCE tam, gdzie logicznie wybierasz pierwszą dostępną wartość, oraz CASE tam, gdzie podejmujesz decyzję na podstawie kilku różnych warunków biznesowych.

Typy danych, konwersje i wydajność COALESCE

COALESCE jest prosty w składni, ale wymaga uwagi przy typach danych. SQL Server musi ustalić jeden typ wyniku dla całego wyrażenia. Robi to zgodnie z zasadami data type precedence, czyli pierwszeństwa typów danych.

Przykład problematyczny:

SELECT COALESCE(NULL, 1, 'tekst') AS Wynik;

SQL Server może próbować przekonwertować 'tekst' do typu liczbowego, ponieważ liczby mają wyższy priorytet niż tekst w określonych kontekstach. Wynikiem może być błąd konwersji.

Bezpieczny zapis:

SELECT COALESCE(CAST(NULL AS VARCHAR(20)), CAST(1 AS VARCHAR(20)), 'tekst') AS Wynik;

Najczęstsze problemy typowania:

  • mieszanie INT, DECIMAL i VARCHAR,
  • mieszanie dat z tekstem,
  • zbyt krótki typ znakowy,
  • niejawne konwersje w kolumnach indeksowanych,
  • różne precyzje DECIMAL,
  • użycie NVARCHAR i VARCHAR bez świadomej decyzji.

W środowiskach firmowych szczególnie ważne są wartości pieniężne. Jeżeli raport finansowy ma pokazać kwoty w PLN, typ powinien być jawnie kontrolowany:

SELECT
    COALESCE(CAST(DiscountAmount AS DECIMAL(18,2)), CAST(0 AS DECIMAL(18,2))) AS DiscountAmount
FROM Invoices;

Dzięki temu unikniesz nieoczekiwanych zaokrągleń i konwersji.

Wpływ na indeksy

COALESCE użyty na kolumnie w warunku WHERE może utrudnić wykorzystanie indeksu:

WHERE COALESCE(Status, 'NEW') = 'NEW'

SQL Server musi obliczyć wyrażenie dla wierszy, co może ograniczyć skuteczność indeksu na kolumnie Status. Często lepszy zapis to:

WHERE Status = 'NEW' OR Status IS NULL

Podobnie problematyczny może być zapis:

WHERE COALESCE(CustomerID, 0) = @CustomerID

W dużej tabeli zamówień lepiej rozważyć osobne warunki lub odpowiednio zaprojektowany indeks filtrowany.

COALESCE w SELECT a COALESCE w WHERE

W sekcji SELECT funkcja zwykle jest bezpieczna wydajnościowo, bo działa na wyniku po dobraniu wierszy:

SELECT COALESCE(DisplayName, LegalName, 'brak nazwy') AS Name
FROM Contractors;

W sekcji WHERE, JOIN i ORDER BY trzeba analizować plan wykonania. Dla małych tabel różnica może być niezauważalna. Dla tabel z milionami rekordów może oznaczać skanowanie zamiast wyszukiwania po indeksie.

Powtarzana ewaluacja wyrażeń

Zgodnie z dokumentacją SQL Server COALESCE jest przekształcany przez optymalizator do konstrukcji podobnej do CASE. W pewnych przypadkach argumenty mogą być oceniane więcej niż raz, zwłaszcza gdy zawierają podzapytania lub funkcje niedeterministyczne. Dlatego nie warto wkładać do COALESCE ciężkich podzapytań bez potrzeby.

Zamiast:

SELECT COALESCE(
    (SELECT TOP 1 Price FROM PriceHistory WHERE ProductID = p.ProductID ORDER BY DateFrom DESC),
    p.DefaultPrice
)
FROM Products p;

często lepiej użyć APPLY:

SELECT
    p.ProductID,
    COALESCE(ph.Price, p.DefaultPrice) AS CurrentPrice
FROM Products p
OUTER APPLY (
    SELECT TOP 1 Price
    FROM PriceHistory
    WHERE ProductID = p.ProductID
    ORDER BY DateFrom DESC
) ph;

Taki kod jest bardziej przejrzysty i łatwiejszy do optymalizacji.

Najlepsze zastosowania COALESCE w firmowych bazach danych

COALESCE jest szczególnie wartościowy tam, gdzie baza danych obsługuje procesy biznesowe, a użytkownik końcowy oczekuje czytelnego wyniku zamiast pustych pól. W firmach korzystających z SQL Server najczęściej spotyka się go w raportach, integracjach, procedurach aktualizacyjnych i warstwie widoków.

Raportowanie sprzedaży

W raportach handlowych brak danych nie może psuć obliczeń:

SELECT
    SalesPersonID,
    SUM(COALESCE(NetAmount, 0)) AS NetSales,
    SUM(COALESCE(VatAmount, 0)) AS VatSales,
    SUM(COALESCE(GrossAmount, 0)) AS GrossSales
FROM SalesInvoices
GROUP BY SalesPersonID;

To pomaga utrzymać spójne wyniki, nawet jeśli część rekordów pochodzi z systemu zewnętrznego lub została zaimportowana przed pełnym zaksięgowaniem.

Dane kontrahenta

W Polsce dane kontrahenta mają znaczenie podatkowe i księgowe. Przy eksporcie do systemów finansowych warto rozróżniać brak wartości, pusty tekst i wartość domyślną:

SELECT
    ContractorID,
    COALESCE(NULLIF(TaxId, ''), 'brak NIP') AS NIP,
    COALESCE(NULLIF(CompanyName, ''), FirstName + ' ' + LastName) AS Nazwa
FROM Contractors;

Takie podejście ogranicza liczbę błędów przy przygotowywaniu dokumentów i zestawień, zwłaszcza gdy dane trafiają dalej do księgowości, systemu e-faktur lub raportowania zarządczego.

Konfiguracja aplikacji

W aplikacjach wielooddziałowych często istnieją ustawienia globalne, oddziałowe i użytkownika. COALESCE świetnie obsługuje hierarchię wartości:

SELECT
    COALESCE(UserSetting.Value, BranchSetting.Value, GlobalSetting.Value, 'default') AS EffectiveValue
FROM Settings GlobalSetting
LEFT JOIN Settings BranchSetting ON BranchSetting.KeyName = GlobalSetting.KeyName
LEFT JOIN Settings UserSetting ON UserSetting.KeyName = GlobalSetting.KeyName;

Logika jest jasna: najpierw ustawienie użytkownika, potem oddziału, potem globalne, na końcu wartość domyślna.

Integracje i import danych

Po migracjach z plików Excel, starszych systemów ERP albo baz Access często występuje mieszanka NULL, pustych tekstów i niekompletnych pól. COALESCE z NULLIF pomaga ujednolicić dane:

SELECT
    COALESCE(NULLIF(ExternalCode, ''), InternalCode, 'BRAK-KODU') AS ProductCode
FROM ImportedProducts;

Aplikacje webowe i API

W API lepiej zwrócić kontrolowaną wartość niż nieprzewidziany NULL, jeśli kontrakt integracyjny tego wymaga:

SELECT
    ProductID,
    ProductName,
    COALESCE(ShortDescription, ProductName) AS DisplayDescription
FROM Products
FOR JSON PATH;

W ten sposób aplikacja front-end nie musi powielać tej samej logiki obsługi braku opisu.

Środowiska produkcyjne SQL Server

Jeżeli firma korzysta z SQL Server jako podstawy aplikacji ERP, sklepu internetowego, systemu magazynowego lub hurtowni danych, warto zadbać nie tylko o poprawne zapytania, ale również o legalną i dopasowaną licencję. Przy zakupie środowiska bazodanowego możesz sprawdzić ofertę SQL Server z fakturą VAT 23% na https://kluczesoft.pl/klucze-sql-server — to prosty sposób na szybkie uzupełnienie licencji dla serwera, środowiska testowego lub nowego projektu.

Typowe błędy przy używaniu COALESCE

Najczęstszy błąd to traktowanie COALESCE jako uniwersalnego lekarstwa na wszystkie problemy z danymi. Funkcja jest użyteczna, ale nie zastępuje poprawnego modelu bazy, walidacji danych ani indeksowania.

Błąd 1: Mylenie NULL z pustym tekstem

COALESCE nie zastąpi pustego tekstu, bo pusty tekst nie jest NULL.

SELECT COALESCE('', 'brak') AS Wynik;

Wynik to pusty tekst, nie brak.

Jeżeli chcesz obsłużyć oba przypadki, użyj NULLIF:

SELECT COALESCE(NULLIF(Email, ''), 'brak e-mail') AS Email
FROM Customers;

Błąd 2: Mieszanie niezgodnych typów

SELECT COALESCE(DatePaid, 'brak płatności') AS PaymentStatus
FROM Invoices;

To zły wzorzec, bo miesza datę z tekstem. Lepiej rozdzielić wartość daty i opis statusu:

SELECT
    DatePaid,
    CASE WHEN DatePaid IS NULL THEN 'brak płatności' ELSE 'zapłacono' END AS PaymentStatus
FROM Invoices;

Błąd 3: Ukrywanie problemów jakości danych

Jeżeli każdą brakującą wartość zastąpisz tekstem brak, raport może wyglądać poprawnie, ale firma straci informację o skali problemu. W systemach produkcyjnych warto mierzyć liczbę braków:

SELECT COUNT(*) AS LiczbaKlientowBezNIP
FROM Contractors
WHERE TaxId IS NULL OR TaxId = '';

COALESCE poprawia prezentację danych, ale nie powinien maskować błędów w procesie ich zbierania.

Błąd 4: Używanie COALESCE w JOIN bez analizy

ON COALESCE(a.Code, a.LegacyCode) = b.Code

Taki warunek może być poprawny logicznie, ale kosztowny wydajnościowo. W dużych bazach lepiej rozważyć osobne warunki, indeksy, kolumny obliczeniowe albo wcześniejsze przygotowanie danych w tabeli stagingowej.

Błąd 5: Zakładanie identycznego działania jak ISNULL

COALESCE i ISNULL bywają wymienne w prostych przypadkach, ale różnią się typowaniem i zachowaniem w bardziej złożonych wyrażeniach. Przy zmianie kodu z ISNULL na COALESCE trzeba sprawdzić:

  • typ wyniku,
  • długość tekstu,
  • nullability w kolumnach obliczeniowych,
  • wpływ na indeksy,
  • plan wykonania zapytania,
  • zachowanie procedur składowanych.

Błąd 6: Brak jawnego CAST w raportach finansowych

Kwoty powinny mieć przewidywalną precyzję:

COALESCE(Amount, 0)

To może działać, ale lepiej jawnie określić typ:

COALESCE(Amount, CAST(0 AS DECIMAL(18,2)))

W raportach finansowych precyzja ma znaczenie, zwłaszcza gdy wyniki trafiają do eksportów, zestawień VAT, dokumentów księgowych lub narzędzi BI.

Częste pytania

Czy COALESCE w SQL Server zwraca pierwszą wartość nie-NULL?

Tak. COALESCE sprawdza argumenty od lewej do prawej i zwraca pierwszą wartość, która nie jest NULL. Jeżeli wszystkie argumenty są NULL, wynik również będzie NULL. To podstawowe zastosowanie tej funkcji w zapytaniach T-SQL.

Czym różni się COALESCE od ISNULL?

ISNULL przyjmuje dokładnie dwa argumenty, a COALESCE może przyjmować dwa lub więcej. COALESCE jest zgodny ze standardem SQL, natomiast ISNULL jest funkcją charakterystyczną dla T-SQL. Różnią się także zasadami typowania wyniku, dlatego w bardziej złożonych zapytaniach nie należy ich zamieniać bez testów.

Czy COALESCE wpływa na wydajność zapytań?

Może wpływać, zwłaszcza gdy jest używany w WHERE, JOIN lub ORDER BY na kolumnach indeksowanych. W sekcji SELECT zwykle nie stanowi problemu. W dużych tabelach warto sprawdzić plan wykonania i porównać zapis z alternatywą typu kolumna = wartość OR kolumna IS NULL.

Czy COALESCE zastępuje pusty tekst?

Nie. Pusty tekst '' nie jest tym samym co NULL. Jeżeli chcesz obsłużyć oba przypadki, użyj połączenia NULLIF i COALESCE, na przykład COALESCE(NULLIF(Email, ''), 'brak e-mail').

Czy można używać COALESCE z datami?

Tak, ale wszystkie argumenty powinny być zgodne typowo. Możesz użyć COALESCE(PaymentDate, DueDate) do wyboru daty płatności albo terminu płatności. Nie zaleca się mieszania daty z tekstem typu 'brak daty' w jednym wyrażeniu, bo prowadzi to do niepotrzebnych konwersji i błędów.

Czy COALESCE działa w SQL Server 2022?

Tak. COALESCE działa w SQL Server 2022, Azure SQL Database i wcześniejszych wspieranych wersjach SQL Server. Jest standardową konstrukcją SQL i pozostaje aktualna w środowiskach używanych w 2026 roku, także na Windows Server 2025.

Czy COALESCE można używać w procedurach składowanych?

Tak. To bardzo częste zastosowanie, szczególnie przy parametrach opcjonalnych i częściowej aktualizacji rekordów. Przykład: SET Phone = COALESCE(@Phone, Phone) pozwala zostawić starą wartość, gdy parametr wejściowy ma NULL.

Czy COALESCE może zwrócić błąd konwersji?

Tak, jeżeli argumenty mają niezgodne typy danych. SQL Server próbuje ustalić jeden typ wyniku według zasad pierwszeństwa typów. Dlatego przy mieszaniu liczb, tekstów i dat warto używać jawnego CAST lub CONVERT.

Czy COALESCE jest lepszy od CASE?

Nie zawsze. COALESCE jest krótszy i czytelny, gdy chodzi wyłącznie o wybór pierwszej wartości nie-NULL. CASE jest lepszy, gdy logika obejmuje różne warunki biznesowe, porównania, zakresy wartości albo wiele niezależnych reguł.

Kiedy nie używać COALESCE?

Nie warto używać COALESCE, gdy ukrywa problemy jakości danych, miesza niezgodne typy albo utrudnia wykorzystanie indeksów w dużych tabelach. W takich przypadkach lepiej poprawić model danych, zastosować CASE, dodać walidację, użyć indeksu filtrowanego albo rozdzielić logikę na kilka czytelnych warunków.

Sprawdź też

Potrzebujesz licencji? Microsoft SQL Server — sprawdź ofertę KluczeSoft.pl — legalne klucze, faktura VAT, dostawa e-mail.

<!-- INLINE-LINKS-V1 -->

Najczęściej zadawane pytania

Tak. `COALESCE` sprawdza argumenty od lewej do prawej i zwraca pierwszą wartość, która nie jest `NULL`. Jeżeli wszystkie argumenty są `NULL`, wynik również będzie `NULL`. To podstawowe zastosowanie tej funkcji w zapytaniach T-SQL.
`ISNULL` przyjmuje dokładnie dwa argumenty, a `COALESCE` może przyjmować dwa lub więcej. `COALESCE` jest zgodny ze standardem SQL, natomiast `ISNULL` jest funkcją charakterystyczną dla T-SQL. Różnią się także zasadami typowania wyniku, dlatego w bardziej złożonych zapytaniach nie należy ich zamieniać bez testów.
Może wpływać, zwłaszcza gdy jest używany w `WHERE`, `JOIN` lub `ORDER BY` na kolumnach indeksowanych. W sekcji `SELECT` zwykle nie stanowi problemu. W dużych tabelach warto sprawdzić plan wykonania i porównać zapis z alternatywą typu `kolumna = wartość OR kolumna IS NULL`.
Nie. Pusty tekst `''` nie jest tym samym co `NULL`. Jeżeli chcesz obsłużyć oba przypadki, użyj połączenia `NULLIF` i `COALESCE`, na przykład `COALESCE(NULLIF(Email, ''), 'brak e-mail')`.
Tak, ale wszystkie argumenty powinny być zgodne typowo. Możesz użyć `COALESCE(PaymentDate, DueDate)` do wyboru daty płatności albo terminu płatności. Nie zaleca się mieszania daty z tekstem typu `'brak daty'` w jednym wyrażeniu, bo prowadzi to do niepotrzebnych konwersji i błędów.
Tak. `COALESCE` działa w SQL Server 2022, Azure SQL Database i wcześniejszych wspieranych wersjach SQL Server. Jest standardową konstrukcją SQL i pozostaje aktualna w środowiskach używanych w 2026 roku, także na Windows Server 2025.
Tak. To bardzo częste zastosowanie, szczególnie przy parametrach opcjonalnych i częściowej aktualizacji rekordów. Przykład: `SET Phone = COALESCE(@Phone, Phone)` pozwala zostawić starą wartość, gdy parametr wejściowy ma `NULL`.
Tak, jeżeli argumenty mają niezgodne typy danych. SQL Server próbuje ustalić jeden typ wyniku według zasad pierwszeństwa typów. Dlatego przy mieszaniu liczb, tekstów i dat warto używać jawnego `CAST` lub `CONVERT`.
Nie zawsze. `COALESCE` jest krótszy i czytelny, gdy chodzi wyłącznie o wybór pierwszej wartości nie-NULL. `CASE` jest lepszy, gdy logika obejmuje różne warunki biznesowe, porównania, zakresy wartości albo wiele niezależnych reguł.
Nie warto używać `COALESCE`, gdy ukrywa problemy jakości danych, miesza niezgodne typy albo utrudnia wykorzystanie indeksów w dużych tabelach. W takich przypadkach lepiej poprawić model danych, zastosować `CASE`, dodać walidację, użyć indeksu filtrowanego albo rozdzielić logikę na kilka czytelnych warunków.

Czy ten artykuł był pomocny?