Articles

SQL CASE – Jednoduchý a Hledali Formy

hlavním účelem SQL PŘÍPADĚ výraz vrátí hodnotu na základě jedné nebo více podmíněných testů. Použití případových výrazů kdekoli ve výrazu příkazu SQL je povoleno. Ačkoli skutečně výraz, někteří lidé se odkazují na ně jako “ případ prohlášení.“To s největší pravděpodobností vyplývá z jejich použití v programovacích jazycích.

výraz SQL CASE je extrémně univerzální a používá se v dotazech SQLServer. Zejména se používá v seznamu vybrat sloupec, seskupit podle, mít, a pořadí podle klauzulí. Výraz CASE také standardizuje (zkrášluje) data nebo provádí kontroly, aby chránil před chybami, jako je dělení nulou.

všechny příklady pro tuto lekci jsou založeny na Microsoft SQL Server Management Studio a databáze AdventureWorks2012. Začínáme používat SQL Server pomocí mého bezplatného průvodce a bezplatných nástrojů společnosti Microsoft.

příkaz SQL Server CASE

existují dvě formy pro klauzuli CASE: jednoduché a prohledávané. Obě formy vrátí výsledek založený na testování výrazu. Ačkoli technicky výrazy, uvidíte, že mnoho lidí to označuje jako prohlášení.

jednoduchý příkaz SQL CASE se používá pro testy rovnosti. Testuje jeden výraz proti více hodnotám, což je skvělé pro transformaci jedné sady hodnot, jako jsou zkratky na odpovídající dlouhou formu.

hledaný příkaz SQL CASE používá komplexnější formát hodnocení výrazů. Je dobré, když chcete pracovat s rozsahy dat, jako jsou platové rozsahy nebo věky.

nejprve začneme jednoduchým formulářem a poté prohledáme.

CASE expression Simple Form

jednoduchá forma CASE expression porovnává výsledky výrazu s řadou testů a vrací „výsledek“, když „test“ vrátí true.

obecný formulář pro jednoduchý výraz CASE je:

CASE expression
WHEN test THEN result

ELSE otherResult
END

příkaz ELSE je ve výrazu CASE volitelný. Vrací „otherResult“, když nejsou provedeny žádné shody a je přítomen jiný. Pokud v příkazu CASE není nic jiného, vrátí NULL.

klauzule ELSE je skvělý způsob, jak zachytit špatné nebo neočekávané hodnoty dat a vrátit jiný výsledek než NULL.

příklad transformace dat

existuje několik důvodů pro použití příkazu CASE. Prvním je transformace dat z jedné sady hodnot na druhou. Chcete-li například zobrazit pohlaví zaměstnance jako „mužské“ nebo „ženské“, když jsou vaše data kódována jako „M“ nebo „F“, použijte výraz případu k testování reprezentace jednoho znaku a vrácení jeho odpovídající dlouhé formy.

příkladem je:

SELECT JobTitle,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
ELSE 'Unknown Value'
END
FROM HumanResources.Employee

příklad standardizace dat

podobně můžete použít jednoduchou klauzuli CASE pro standardizaci několika hodnot do jedné. Rozšíření našeho příkladu mapuje několik variací na muže nebo ženy:

možná vás zajímá, zda byste mohli v databázi vytvořit jinou tabulku a použít ji k vyhledávání hodnot. Chtěl bych souhlasit, že by to bylo nejlepší, ale v mnoha situacích nebudete mít oprávnění k vytváření tabulek v databázi. V tomto případě jste ponecháni na váš důvtip SELECT prohlášení poskytuje.

shrnutí

zde je několik věcí, které je třeba zvážit při použití jednoduchého výrazu:

  • umožňuje pouze srovnání rovnosti.
  • vyhodnocuje testy jsou hodnoceny v definovaném pořadí.
  • vrátí výsledek odpovídající prvnímu skutečnému testu.
  • pokud není provedena žádná shoda, případ vrátí NULL, pokud není přítomen jiný.

CASE výraz hledaný formulář

vyhledávací formulář výrazu CASE umožňuje univerzálnější testování. Použijte jej k vyhodnocení většího rozsahu testů. Ve skutečnosti se jakýkoli booleovský výraz kvalifikuje jako test.

prohledali od PŘÍPADĚ výraz má tento formát

CASE
WHEN booleanExpression THEN result

ELSE otherResult
END

na hledané formy, použití, KDYŽ doložky k vyhodnocení Booleovských výrazů. Výsledek prvního pravdivého booleovského výrazu je vrácen.

níže je hledaný případový formulář příkladu pohlaví zaměstnance z předchozí části.

stejný příklad jsme použili také pro jednoduchý příkaz SQL case. Udělal jsem to, abyste viděli ten jemný rozdíl. Všimněte si, že každá klauzule WH nyní obsahuje test jako booleovský výraz.

Srovnání Jednoduché a Hledali Formy SQL PŘÍPADĚ

Zde jsou výroky side-by-side:

Jednoduché versus Hledal PŘÍPADĚ, že výraz

mám tendenci používat hledal PŘÍPADĚ výraz podobě ve všech mých SQL. Tento důvod je jednoduchý, musím si pamatovat pouze jeden formát!

protože testujeme Booleovské výrazy, příkaz hledaný případ se neomezuje pouze na testy rovnosti. Díky tomu je tento formulář opravdu dobrý pro porovnání rozsahů hodnot. Možná chce manažer prodeje Adventure Works uspořádat produkty podle cenového rozpětí. Jak by to mohlo být provedeno s SQL?

Vzhledem k následující názvy a rozsahy poskytována manažer prodeje, můžeme sestavit PŘÍPADĚ projevu porovnat ListPrice na rozsah hodnot, a pak se vrátit příslušnou cenu range jméno.

příkaz case se umístí do seznamu sloupců SELECT a vrátí hodnotu znaku. Zde je SQL, který dělá trik:

Při spuštění tohoto dotazu uvidíte PriceRange seznamu a zobrazení hodnot podle rozsahů uvedených v PŘÍPADĚ projevu:

CASE Výsledky

PŘÍPAD výpisy, které mohou být také použity k pomoci zabránit chyby. Dobrým příkladem je testování platných hodnot ve výrazech, například když dělíte čísla.

Za

SELECT ProductID,
Name,
ProductNumber,
StandardCost,
ListPrice,
StandardCost / ListPrice as CostOfGoodSold
FROM Production.Product

Toto prohlášení vrátit zprávu

Divide by zero error encountered.

pomocí PŘÍPADĚ klauzule můžeme zajistit nemáme nechtěně dělit nulou.

SELECT ProductID, Name, ProductNumber, StandardCost, ListPrice, CASE WHEN ListPrice = 0 Then NULL ELSE StandardCost / ListPrice END as CostOfGoodSoldFROM Production.Product

výraz případu lze použít všude tam, kde lze použít výraz. To znamená, že jej můžete použít k vrácení výsledku hodnoty sloupce nebo jej dokonce použít v klauzuli pořadí podle klauzule.

v následující části prozkoumáme použití písmen v klauzulích pořadí podle a seskupení podle.

PŘÍPADĚ, že výraz v POŘADÍ PODLE

pokračujeme s sales manager žádosti, že ji chce také vidět produkty řazeny podle cenové rozpětí, a pak název produktu. Viděli jsme, jak můžeme zobrazit cenové rozpětí jako sloupec, ale jak řadíme?

ve skutečnosti je to docela snadné. Protože případ je výraz, můžeme jej použít jako jednu z hodnot, ze kterých se výsledky objednávají. Nezapomeňte, že nejsme omezeni pouze na třídění sloupců tabulky, můžeme také třídit výraz.

zde je dotaz, který se má třídit podle cenového rozpětí.

pak můžeme přidat příkaz CASE pro výběr seznamu a zobrazit také cenové rozpětí.

jak vidíte, věci se začínají komplikovat. Vidíte, jak se příkaz CASE opakuje jak v seznamu SELECT, tak v pořadí podle? Naštěstí, můžeme zjednodušit to trochu, ale odstranění PŘÍPAD prohlášení od OBJEDNÁVKY a nahradit ji s seznamu SELECT CASE výraz alias jméno PriceRange jako tak:

PŘÍPADĚ, že výraz v GROUP BY

Nyní, že jsme dali sales manager podrobný výpis chce vidět souhrnná data – není to někdy skončí? Podle mých zkušeností to tak není, takže znát spoustu SQL k uspokojení požadavků zákazníků je vaším klíčem k úspěchu.

každopádně dobrou zprávou je, že můžeme použít výraz CASE, který jsme vytvořili, k vytvoření souhrnných skupin. V následujícím SQL seskupujeme data podle PriceRange. Souhrnné statistiky o minimálním, maximálním a průměrném Seznamucena jsou vytvořeny.

Na rozdíl od klauzule ORDER BY nemůžeme odkazovat na sloupec alias PriceRange ve skupině podle. Celý případ se musí opakovat. Zde jsou výsledky našeho dotazu:

Výsledky – v PŘÍPADĚ, že Výraz v GROUP BY

Wrap

Jak můžete vidět, s použitím PŘÍPADĚ výrazů dodává všestrannost do vašeho SQL. Umožňují nejen transformovat data z jedné sady hodnot na druhou, ale mohou být také použity k zajištění toho, aby příkazy nevracely chyby.

ze dvou formulářů, jednoduchých a prohledávaných, mám tendenci používat vyhledávací formulář. Důvodem je, že jednoduchá forma je omezena na testy rovnosti; zatímco hledaná forma to dokáže a další.

vzhledem k tomu, že CASE výrazy jsou výrazy a ne příkazy nebo klauzule, mohou být použity tam, kde je použit jakýkoli jiný výraz. To znamená, že můžete použít v celém příkazu SELECT a jinde v SQL.