Pochopení funkce COALESCE () v SQL

Vzhledem k tomu, že technologie rostou a vyvíjejí se, je nezbytné, abyste jako vývojáři byli informováni o nejnovějších trendech. Ať už jste začátečník nebo expert, dobrá znalost manipulace s řetězci vám pomůže připravit data (například generovat jiný formulář než ten stávající, aby byl použitelný pro vaše podnikání) a spravovat je pomocí vestavěných funkcí SQL serveru.

Kromě manipulace s daty můžete zkoumat datové sady, vyhodnocovat datové hodnoty a kódovat nebo dekódovat je, abyste získali smysluplnější data. Ve výsledku vám to pomůže procházet chybějícími hodnotami v souborech dat, pochopit jejich dopad na výpočty a zefektivnit celkovou práci s datovým procesem, abyste se vyhnuli hodnotám Null, které mohou zničit výsledky operací.

Tato příručka vás provede funkcí sloučení v SQL, která pomáhá vytvářet složité programy. Příspěvek předpokládá, že jste se setkali a pracovali s SQL a jen se snažíte posílit své porozumění této konkrétní funkci. Naše série příruček SQL vám může pomoci rychle začít.

Co je COALESCE () v SQL a jeho použití?

Slučovací funkce v SQL vyhodnocuje parametry (argumenty) v určeném pořadí, jako jsou seznamy, a vrací první nenulovou hodnotu. Jednoduše řečeno, funkce vyhodnotí váš seznam postupně a skončí v instanci první nenulové hodnoty. Pokud jsou všechny argumenty v seznamu null, funkce vrátí NULL.

Funkce je navíc zahrnutá a podporovaná v jiných databázích, jako je MYSQL, Azure SQL Database, Oracle a PostgreSQL.

Coalesce můžete použít v následujících případech, když:

  • Zpracování hodnot NULL.
  • Spuštění několika dotazů jako jednoho.
  • Vyhýbejte se zdlouhavým a časově náročným příkazům CASE.

Při použití namísto příkazů CASE (nebo funkce ISNULL) sloučení vyžaduje mnoho parametrů, na rozdíl od příkazu CASE, který vyžaduje pouze dva. Tento přístup vám umožňuje psát méně kódu a usnadňuje proces zápisu.

Zde je syntaxe:

COALESCE(valueOne, valueTwo, valueThree, …, valueX);

Coalesce na serveru SQL má několik vlastností, včetně argumentů stejného datového typu, přijímání mnoha parametrů a argumentů typu integer, které mají být kaskádovány funkcí výnosu, aby jako výstup vrátily celé číslo.

Přečtěte si také: Ultimate SQL Cheat Sheet do záložek na později

Ale než se dostaneme k tomu, jak používat sloučení, pochopme NULL.

Co je hodnota NULL v SQL?

Jedinečná značka NULL v SQL označuje neexistenci hodnoty v databázi. Můžete si to představit jako nedefinovanou nebo neznámou hodnotu. Nenechte se, prosím, do toho úskalí myslet na to jako na prázdný řetězec nebo nulovou hodnotu; je to absence hodnoty. Výskyt null ve sloupcích tabulky představuje chybějící informace.

V praktickém případě lze datový sloupec ve sloupci databáze webových stránek elektronického obchodu vyplnit hodnotou NULL, pokud zákazník neposkytne své ID. Null v SQL je jedinečný; je to stav, na rozdíl od jiných programovacích jazyků, kde to znamená „neukazovat na konkrétní objekt“.

Hodnoty NULL v SQL mají významný dopad na relační databáze. Za prvé vám umožňují vyloučit určité hodnoty při práci s jinými interními funkcemi. Můžete například vygenerovat seznam celkových objednávek v produkčním prostředí, ale další je třeba ještě dokončit. Použití NULL jako zástupného symbolu umožňuje interní funkci SUM přidat součty.

Dále zvažte případy, kdy potřebujete vygenerovat průměr pomocí funkce AVG. Pokud pracujete s nulovými hodnotami, jsou výsledky zkreslené. Místo toho může databáze taková pole odstranit a použít hodnotu NULL, což vede k přesným výstupům.

Hodnoty NULL nemají nevýhody. Jsou považovány za hodnoty s proměnnou délkou, jsou to bajty nebo několik z nich. Protože databáze ponechává prostor pro tyto bajty, pokud překračují to, co je uloženo v databázi, výsledkem je, že vaše databáze zabere více místa na pevném disku než použití běžných hodnot.

Při práci s některými funkcemi je navíc budete muset upravit, abyste odstranili NULLS. To ve výsledku prodlužuje vaše SQL procedury.

Zpracování hodnot NULL pomocí COALESCE ()

Hodnoty Null znamenají, že byste mohli mít hodnotu, ale nevíte, jaká by tato hodnota měla být. Dokud neshromáždíte data, která vyplní vaše pole skutečnými hodnotami, prokuristy jsou hodnoty NULL.

I když můžete použít hodnoty NULL pro více typů dat v databázi, včetně desetinných míst, řetězců, objektů blob a celých čísel, je dobré se jim při práci s číselnými daty vyhnout.

Nevýhodou je, že při použití pro číselné hodnoty budete pravděpodobně potřebovat vysvětlení při vývoji kódu, který pracuje s daty. Více o tom později.

Různé způsoby, jak lze COALESCE () použít ke zpracování hodnoty NULL:

Použití COALESCE () k nahrazení hodnot Null konkrétní hodnotou

Pomocí COALESCE () můžete vrátit konkrétní hodnoty pro všechny hodnoty null. Můžete mít například tabulku nazvanou „zaměstnanci“ se sloupcem „plat“, který může obsahovat nulové hodnoty, pokud mzda zaměstnanců nebyla připsána. Takže když provádíte některé výpočty, možná budete chtít pracovat s konkrétní hodnotou, v tomto případě nulou, pro všechny položky NULL. Zde je návod, jak na to.

SELECT COALESCE(salary, 0) AS adjusted_salary
FROM employees;

Pomocí COALESCE () vyberte první nenulovou hodnotu z více možností

Někdy můžete chtít pracovat s prvními hodnotami, které nejsou NULL v seznamu výrazů. V takových případech často máte více sloupců se souvisejícími daty a chcete upřednostnit jejich hodnoty, které nejsou NULL. Syntaxe zůstává.

COALESCE (expression1, expression2, …)

V praktickém případě předpokládejme, že máte tabulku kontaktů se sloupci preferované_jméno a celé_jméno. A chtěli byste vygenerovat seznam kontaktů vedle sebe s jejich preferovanými jmény (pokud jsou k dispozici) nebo jejich úplnými jmény. Zde je návod, jak to řešit.

SELECT COALESCE(preferred_name, full_name) AS display_name
FROM contacts.

Pokud preferovaný_název není pro tento testovací případ NULL, bude vrácen. V opačném případě se jako zobrazovaný název vrátí celé jméno.

Zřetězení řetězců s SQL Coalesce

Můžete narazit na problémy s SQL při zřetězení řetězců, pokud se jedná o hodnoty null. V takových případech je vrácena hodnota NULL jako nežádoucí výsledek. Nyní, když NULL není naším požadovaným výsledkem, můžete problém vyřešit pomocí funkce sloučení. Níže je uveden příklad.

Jednoduché zřetězení řetězců se provádí takto:

SELECT ‘Hello, where are you, ‘|| ‘John ’||? AS example

Kód vrátí:

Příklad Ahoj, kde jsi, Johne?

Pokud však použijete hodnotu NULL, jak je uvedeno níže:

SELECT ‘Hello, where are you, ‘ || null || ‘?’ AS example

Výstup je nyní.

Protože každé zřetězení textového řetězce obsahující hodnotu NULL vrátí hodnotu NULL, je výsledek výše NULL. Problém je však vyřešen pomocí koalesce (). Pomocí této funkce vrátíte prázdný řetězec (nebo mezeru) namísto NULL. Předpokládejme například, že uvádíte názvy automobilů s jejich výrobci; zde je váš dotaz.

SELECT 
car || ‘, manufacturer: ‘ || COALESCE(manufacturer, ‘—') AS car_brand
FROM stock

Pokud je výrobce NULL, budete mít ‚–‘ místo NULL. Zde jsou očekávané výsledky.

car_brandoutlander, výrobce: —flying spurs, výrobce: Bentleyroyal athlete, výrobce: —royal seloon, výrobce: Crown

Jak můžete vidět, výsledky NULL jsou eliminovány s možností vložení hodnoty náhradního řetězce.

SQL Coalesce Function a Pivoting

SQL pivoting je technika používaná pro transformaci řádků na sloupce. Umožňuje transponovat (rotovat) data z „normalizovaného“ formuláře (s mnoha řádky a méně sloupci) do „denormalizovaného“ (méně řádků a více sloupců). Funkci sloučení lze použít s pivotováním SQL ke zpracování hodnot null v pivotovaných výsledcích.

Když PIVOT v SQL, transformujte řádky na sloupce; výsledné sloupce jsou agregované funkce některých dat. Pokud je v každém případě výsledkem agregace pro konkrétní buňku hodnota null, můžete pomocí příkazu `COALESCE` nahradit hodnoty null výchozí hodnotou nebo smysluplným vyjádřením. Níže je uveden příklad.

Vezměme si tabulku, tržby, se sloupci rok, čtvrtletí a příjmy, a vy byste chtěli seřadit data; tak, že máte roky jako sloupce a součet příjmů za každé čtvrtletí jako hodnoty. Některá čtvrtletí však nemají žádné údaje o tržbách, takže v pivotovaném výsledku jsou nulové hodnoty. V tomto případě můžete použít COALESCE k nahrazení hodnot null v pivotovaném výsledku nulou (0).

SELECT
    year,
    COALESCE(SUM(CASE WHEN quarter="Q1" THEN revenue END), 0) AS Q1_Revenue,
    COALESCE(SUM(CASE WHEN quarter="Q2" THEN revenue END), 0) AS Q2_Revenue,
    COALESCE(SUM(CASE WHEN quarter="Q3" THEN revenue END), 0) AS Q3_Revenue,
    COALESCE(SUM(CASE WHEN quarter="Q4" THEN revenue END), 0) AS Q4_Revenue
FROM sales
GROUP BY year;

Skalární uživatelsky definovaná funkce a funkce SQL Coalesce

Skalární UDF a sloučení můžete použít k provádění složité logiky, která zpracovává hodnoty null. Kombinace těchto funkcí vám pomůže dosáhnout sofistikovanějších transformací dat a výpočtů v dotazech SQL. Zvažte tabulku, Zaměstnanci, s touto strukturou.

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Salary INT,
    Bonus INT
);

Možná budete chtít vypočítat celkový výdělek každého zaměstnance (plat plus bonus). Některé hodnoty však chybí. V tomto případě může váš skalární UDF zpracovat přidání platu a bonusu, zatímco sloučení zvládá nulové hodnoty. Zde je skalární UDF pro celkové příjmy.

CREATE FUNCTION dbo.CalculateTotalEarnings (@salary INT, @bonus INT)
RETURNS INT
AS
BEGIN
    DECLARE @totalEarnings INT;
    SET @totalEarnings = @salary + COALESCE(@bonus, 0);
    RETURN @totalEarnings;
END;
You can then use the scalar UDF with coalesce in a query:
SELECT EmployeeID, FirstName, LastName,
       Salary, Bonus, dbo.CalculateTotalEarnings(Salary, Bonus) AS TotalEarnings
FROM Employees;

Ověření dat pomocí SQL Coalesce

Při práci s databázemi možná budete chtít ověřit číselné hodnoty. Řekněme například, že máte sloupce název_produktu, cena a sleva v tabulce produkty. Chcete načíst názvy produktů, ceny a slevy každé položky. Rádi byste však se všemi hodnotami NULL slevy zacházeli jako s 0. Funkce sloučení může být užitečná. Zde je návod, jak jej používat.

SELECT product_name, price, COALESCE(discount, 0) AS discount 
FROM products

SQL sloučení a vypočítané sloupce

Vypočítané sloupce jsou virtuální sloupce vypočítané na základě výrazů nebo jiných sloupců v tabulce. Vzhledem k tomu, že vypočítané sloupce nejsou fyzicky uloženy v databázi, můžete je využít pomocí funkce sloučení při zpracování složitých scénářů a transformací. Zde je praktický příklad použití.

Zvažte tabulku `produktů` se sloupci `cena`, `sleva` a `daňová_sazba`. V tomto případě chcete vytvořit vypočítaný sloupec `celková_cena`, který bude představovat konečnou cenu produktu po uplatnění slevy a daně. Pokud není zadána sleva nebo daň (NULL), budete chtít ve výpočtech pokračovat s nulou. Zde je návod, jak využít koalesce, aby vyhovovala provozu.

CREATE TABLE products(
price DECIMAL(10, 2),
discount DECIMAL(10, 2),
tax_rate DECIMAL(5, 2),
total_price AS (COALESCE(price, 0) – COALESCE(price*discount, 0))* COALESCE(1+tax_rate, 1)
);

Ve výše uvedeném kódu se děje zde.

  • Vypočítaný sloupec total_price je definován jako (COALESCE(cena, 0) – COALESCE(cena*sleva, 0))* COALESCE(1+daňová_sazba, 1).
  • Pokud je cena NULL, COALESCE(cena*sleva, 0) zajistí, že bude považována za 0.
  • Pokud je sleva nulová, COALESCE(cena*sleva) zajistí, že bude považována za 0 a násobení neovlivní výpočet.
  • Pokud je daňová_sazba NULL, COALESCE(1 + daňová_sazba, 1) zajistí, že bude považována za 0, což znamená, že se nepoužije žádná daň a násobení neovlivní výpočet.
  • Výše uvedené nastavení vám umožňuje vygenerovat vypočítaný sloupec total_price se skutečnou konečnou cenou, i když chybí nebo mají hodnoty NULL.

    SQL Coalesce a CASE Expression

    Syntakticky můžete použít sloučení prostřednictvím výrazu CASE. Zde je příklad:

    SELECT
    Productname + ‘ ’+ deliverydate productdetails,
    dealer,
    CASE
    WHEN cellphone is NOT NULL Then cellphone
    WHEN workphone is NOT NULL Then workphone
    ELSE ‘NA’
    END
    EmergencyContactNumber
    FROM
    dbo.tb_EmergencyContact

    Ve výše uvedeném nastavení se CASE dotazuje jako funkce COALESCE.

    Navíc je možné použít výrazy COALESCE a CASE ve stejném dotazu. Tyto dvě techniky mohou zpracovávat hodnoty NULL a současně aplikovat podmíněnou logiku. Ukažme si to na příkladu.

    Zvažte případ, kdy máte tabulku, produkty se sloupci product_id, product_name, price a sleva. Některé z vašich produktů mají konkrétní slevu, zatímco jiné nikoli. Pokud má produkt slevu, chcete zobrazit zlevněnou cenu, jinak by se měla zobrazit běžná cena.

    SELECT 
        product_id,
        product_name,
        price,
        COALESCE(
            CASE
                WHEN discount > 0 THEN price - (price * discount / 100)
                ELSE NULL
            END,
            price
        ) AS discounted_price
    FROM products;
    

    Ve výše uvedeném kódu „CASE“ zkontroluje, zda je „sleva“ větší než nula, a vypočítá zlevněnou cenu, jinak vrátí NULL. Funkce `COALESCE` přebírá výsledek z `CASE` a `price` jako své parametry. Vrátí první hodnotu, která není NULL, a efektivně vrátí zlevněnou cenu, pokud je k dispozici, nebo běžnou cenu, pokud žádná neexistuje.

    Závěrečná slova

    Tento příspěvek demonstroval různé způsoby použití funkce `COALESCE` ve vašich databázových dotazech. Vyhodnocením parametrů v zadaném pořadí a vrácením první hodnoty, která není NULL, funkce sloučení zjednodušuje dotazy a zefektivňuje je.

    Coalesce je všestranná funkce, ať už zpracováváte hodnoty null, zřetězení řetězců, pivotování dat, ověřování nebo práci s vypočítanými sloupci. Díky zvládnutí funkce sloučení mohou vývojáři procházet chybějícími daty a vytvářet bezchybné návrhy databází. Pamatujte, abyste zvládli techniku; možná budete potřebovat hlubší praxi.

    Nyní se můžete podívat, jak vytvořit omezení cizího klíče v SQL.