Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL CASE изявление:Какво е това и кои са най-добрите начини да го използвате?

SQL CASE оператор оценява и връща резултати въз основа на определени стойности, предикати и условия според дефинираната логика. Например, да предположим, че имате таблица на избирателите със следните подробности:

  • Идентификационен номер на избирателя
  • Име
  • DOB

Ако търсите логика относно допустимостта на гласуване, това ще зависи от стойностите в колоната DOB.

Ако възрастта на избирателя е по-голяма от 18 години, той има право да гласува.

Нека разгледаме друг пример. Много пъти съхраняваме стойностите на колоните в битове 1 или 0. Да приемем, че съхранявате стойностите за наличността на даден продукт като 1 или 0. Например:

  • 1 =Продуктът е наличен
  • 0 =Продуктът не е на склад

Ако погледнем от гледна точка на базата данни, добра практика е да използваме съкращенията или битовете, където е възможно. Това е полезно за оптимизатора на заявки на SQL Server при подготовката на оптимизирания план за изпълнение. Но от гледна точка на приложението, крайният потребител не изисква тези стойности. Клиентите просто трябва да видят дали продуктът е наличен или не.

На изображението по-долу виждаме както базата данни, така и перспективата на приложението.

Какво прави операторът SQL CASE?

Инструкция CASE в SQL Server оценява израз и връща стойност въз основа на дефинираните условия. Следователно в предишния пример операторите CASE работят, както е показано по-долу.

На високо ниво синтаксисът за SQL CASE израз е показан по-долу. Тук посочихме множество условия. SQL Server оценява условията последователно. След като условието се оцени успешно, то спира оценката на останалите условия. Ако нито едно от условията не е изпълнено, можем да използваме незадължителен оператор ELSE, за да върнем стойността по подразбиране. Например, ако имаме стойност, различна от 0 и 1 в колоната за наличност, получавате изхода от кодовия блок ELSE. Изисква поне един набор от блокове WHEN и THEN. Инструкцията CASE трябва да завършва с блок END.

Нека разгледаме оператора SQL CASE, като използваме различни примери.

Забележка:В тази статия използваме примерната база данни на Microsoft, AdventureWorks. Можете да изтеглите резервното му копие от Microsoft Docs.

Изразът SELECT с прост CASE израз

В този тип изрази CASE използваме изрази за проверка на равенството. Следната заявка имплементира прост CASE израз.

  • Ако стойността в [SalariedFlag] е 1, тогава тя показва Активния служител
  • За всички други стойности той показва изхода като Неактивен служител
ИЗБЕРЕТЕ ТОП 5 Nationalidnumber ,CASE salariedflagWHEN 1 THEN 'Active Employee'ELSE 'Inactive Employee'END AS [Falaed Flag]ОТ [AdventureWorks2019].[HumanResources].[служител]

Можем да посочим множество условия за израза CASE.

ИЗБЕРЕТЕ ТОП 5 Nationalidnumber ,CASE salariedflagWHEN 1 THEN 'Active Employee'WHEN 0 THEN 'Inactive Employee'ELSE 'Невалидна стойност'END КАТО [Falaried Flag]ОТ [AdventureWorks2019].[preemployee].[preemployee].[employee] 

Стандартизиране на данни с помощта на SQL CASE изрази

Обикновено използваме съкращения, за да съхраняваме стойности в SQL таблици. Стандартните съкращения са пол, кодове на държави, брачен статус, популярни имена на продукти и т.н.

Да предположим, че указваме съкращенията за съхраняване на пола на служителите. Сега нашето приложение трябва да показва резултатите без никакви съкращения.

SQL CASE изразите помагат за стандартизиране на изхода за определени критерии. В заявката по-долу използваме следните условия:

  • Ако стойността за пол е M , покажете го като Мъжки
  • Ако стойността за пол е F , покажете го като Женски
  • За всякакви други стойности покажете Невалидно Стойност
ИЗБЕРЕТЕ РАЗЛИЧЕН РЕГИСТРИР полWHEN 'M' THEN 'Male'WHEN 'F' THEN 'Female'ELSE 'Invalid Value'END AS GenderFROM AdventureWorks2019.HumanResources.Employee

Търсени CASE изрази

В търсения израз CASE ние указваме CASE израз вместо директните стойности. След като стойността на израза оцени и удовлетвори условие в клаузата WHEN, се връща съответната стойност.

Вижте следната SQL заявка. Тук дефинирахме изрази в клаузата WHEN за [ListPrice]. Той идентифицира, че цената на продукта е $250 и е маркиран като елемент от електроника.

ИЗБЕРЕТЕ номер на продукт, име, [Категория на продукта] =СЛУЧАЙ, КОГАТО ListPrice =0 СЛЕД 'Изчерпани артикули', КОГАТО ListPrice> 0 и ListPrice<=100 СЛЕД 'Потребителски стоки', КОГАТО ListPrice>100 и ListPrice <=500 THEN ' Електронни артикули“ КОГАТО ListPrice>500 и ListPrice <1500 ТОГАВА „Луксозни артикули“ ДРУГИ „Допълнителни артикули“ КРАЙ ОТ Производството. Поръчка на продукта по ListPrice desc

За примера за пол, споменат по-рано, можем да пренапишем оператора SQL CASE за съкращенията на пола, като използваме търсените оператори за case.

ИЗБЕРЕТЕ РАЗЛИЧЕН РЕГИСТР, КОГАТО Пол='M' THEN 'Male'WHEN Gender='F' THEN 'Female'ELSE 'Invalid Value'END AS GenderFROM AdventureWorks2019.HumanResources.Employee

Използване на оператори CASE с клаузата ORDER BY

SQL заявките използват клаузата ORDER BY за сортиране на данни във възходящ или низходящ ред. Можете да използвате операторите CASE във връзка с клаузата ORDER BY. Да предположим, че от таблицата с продуктите извличаме [ProductName] и [ListPrice]. Искаме да сортираме резултатите по следните начини:

  • Ако продуктовата списъчна цена е по-малка от 2000, искате резултатът да е в реда на сортиране по подразбиране, т.е. възходящ
  • Ако продуктовата списъчна цена е по-голяма от 2000, сортирането на клаузата ORDER BY води в низходящ ред.

В тази заявка използваме два SQL CASE израза за прилагане на логиката.

SELECT Name,ListPriceFROM Production.ProductORDER BY CASEWHEN ListPrice<=2000 THEN ListPrice END ,CASE WHEN ListPrice>2000 THEN ListPrice END DESC

В изхода на заявката по-долу можете да проверите сортирането на данни в низходящ и възходящ ред.

В друг пример, да предположим, че искаме да сортираме данни в таблицата на служителите въз основа на следното условие:

  • За активни служители (текущ флаг =1) данните трябва да сортират колоната за дата на наемане
  • За неактивни служители трябва да сортира данните според стойностите в колоната за дата на раждане
ИЗБЕРЕТЕ NationalIDNumber,JobTitle,Hiredate,BirthDate, currentflagFROM AdventureWorks2019.HumanResources.Employee ПОРЪЧКА ПО СЛУЧАЙ CURRENTFLAG WHEN 1 THEN HireDate else Дата на раждане край

В изхода на заявката можем да проверим реда на сортиране на данни, дефиниран от клаузата ORDER BY и изразите CASE.

Израз CASE в SQL и агрегатни функции

Агрегираните функции в SQL Server извършват изчисления и връщат една стойност. Примери за агрегатни функции са MIN, MAX, COUNT, ABG и CHECKSUM.

Да предположим, че искаме да извлечем броя на наетите служители за всяка година от 2007-2010 г. Той трябва да показва резултати в следния формат:

За тази цел използваме агрегатната функция COUNT в SQL Server.

  • Първо, функцията SQL DATEPART филтрира данните според годината. Например DATEPART(YY, Hiredate)=2007 филтрира данните за 2007 г.
  • След това използваме оператора CASE, за да върнем 1, ако годината е 2007.
  • Обобщаващата функция за броене брои записите и показва резултатите.
  • По същия начин заявката работи за оставащите години.
SELECT Count(CASEWHEN Datepart(yy, hiredate) =2007 THEN 1ELSE NULLEND) КАТО [2007Hires],Count(CASEWHEN Datepart(yy, hiredate) =2008 THEN 1ELSE NULLEND) КАТО [2008Hires(CASEWENyH] , hiredate) =2009 THEN 1ELSE NULLEND) КАТО [2009Hires],Count(CASEWHEN Datepart(yy, hiredate) =2009 THEN 1ELSE NULLEND) КАТО [2010Hires]FROM AdventureWorks2019.HumanResourceepreresource.HumanResource 

По същия начин, да кажем, че искаме да използваме агрегатната функция GROUP BY за групиране на редове със същата продуктова категория. Можем да посочим израза CASE в SQL, за да сортираме данни от групирания набор от резултати.

ИЗБЕРЕТЕ [Категория на продукта] =СЛУЧАЙ, КОГАТО списъкна цена =0 СЛЕД 'Изчерпани артикули', КОГАТО каталожна цена> 0И каталожна цена <=100 СЛЕД 'Потребителски стоки', КОГА каталожна цена> 100 И каталожна цена <=500 СЛЕД 'Електронни артикули' КОГАТО 50 каталожна цена каталожна цена <1500 СЛЕД 'Луксозни артикули'ОЩЕ 'Допълнителни артикули' КРАЙ,Мин.(каталожна цена) КАТО Мин.цена,Максимална(каталожна цена) КАТО Макс.цена,брой(каталожна цена) КАТО Брой продукти ОТ production.productGROUP BY CASEWHEN listprice =0 СЛЕД 'Изчерпани артикули' КОГА каталожна цена> 0И каталожна цена <=100 СЛЕД 'Потребителски стоки'КОГА каталожна цена> 100И каталожна цена <=500 СЛЕД 'Електронни артикули'КОГА каталожна цена> 500И каталожна цена <1500 СЛЕД 'Луксозни артикули'ДРУГИ артикули'ПРЕДВАРИТЕЛНА ПОРЪЧКА'> 

В горната заявка използваме два SQL CASE израза.

  • Първият израз CASE категоризира данните въз основа на израза, дефиниран в каталожната цена. Използвайки този израз CASE, ние разделяме продуктите в следните категории:
    • Изчерпани артикули
    • Потребителски стоки
    • Електронни артикули
    • Луксозни артикули
  • В изявлението за втория случай използваме агрегатната функция GROUP BY, за да групираме резултата по категория
  • Освен това сортираме резултатите според NumberOfProducts в низходящ ред.

Предотвратяване на грешка при деление на нула с помощта на SQL CASE изрази

Грешка при деление на нула възниква, ако стойността на знаменателя е нула. Ако направите тези дроби в SQL Server, това ще ви даде грешка при деленето на нула, както е показано по-долу.

Отлична практика е да пишете вашите заявки по начин, за да избегнете тези често срещани грешки. За да избегнем това, използваме дробната логика в израза CASE.

DECLARE @Student1 INTDECLARE @Student2 INTSET @Student1=100SET @Student2=0selectCASE WHEN @Student2=0THEN NULLELSE @Student1/@Student2 край като StudentMarksRatio

Защитихме нашата заявка от грешка при деленето на нула. Сега, с модифицираната логика, ако получим нула в знаменателя, вие получавате NULL в изхода, както е показано по-долу.

Полезни напомняния за оператора SQL CASE

  • SQL CASE изразите поддържат до 10 нива на влагане
  • Не можете да контролирате потока на изпълнение на изрази, функции или процедури, използвайки CASE изрази.
  • Винаги трябва да използвате ELSE блок, така че ако не са изпълнени някакви условия, да получите стойност по подразбиране
  • Трябва да избягвате използването на конфликтни условия в SQL оператора CASE. Инструкцията CASE работи последователно и спира оценката при първото успешно условие

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Когато представянето на Distinct и Group By е различно?

  2. Променете формата на датата и часа по подразбиране в една база данни в SQL Server

  3. Как да направите ЛЯВО ПОЛУ ПРИСЪЕДИНЕНИЕ в SQL Server

  4. Как да използвате ВСИЧКИ логически оператор в SQL Server - SQL Server / TSQL урок, част 126

  5. Как да проверите съвместимостта на базата данни на SQL Server, след като sp_dbcmptlevel е остарял?