Примеры использования выражения CASE в Transact-SQL

В этой статье мы рассмотрим выражение CASE языка Transact-SQL, Вы узнаете, что это за выражение, его синтаксис, а также мы разберем несколько примеров использования выражения CASE.

CASE в Transact-SQL

CASE – это инструкция, которая проверяет список условий и возвращает соответствующий результат. Если говорить в целом о программировании, то CASE – это что-то вроде многократного использования конструкции IF-ELSE, во многих языках есть похожая конструкция SWITCH, так вот CASE, как я уже отметил, делает примерно то же самое.

Выражение CASE можно использовать практически в любой инструкции T-SQL, где есть возможность использовать допустимые выражения, например: SELECT, UPDATE, WHERE, SET и даже в ORDER BY.

CASE имеет два так называемых формата:

  • Простое выражение CASE – это простое сравнение значения (выражения) с набором других значений (выражений);
  • Поисковое выражение CASE – в данном случае CASE содержит набор логических выражений, которые вычисляются, чтобы вернуть результат.

Синтаксис CASE в Transact-SQL

Простое выражение CASE

   
   CASE input_expression
       WHEN when_expression THEN result_expression [ ...n ]   
       [ ELSE else_result_expression ]   
   END

Поисковое выражение CASE

   
   CASE  
       WHEN Boolean_expression THEN result_expression [ ...n ]   
       [ ELSE else_result_expression ]   
   END  

Описание параметров:

  • input_expression — выражение, которое необходимо проверить в простом формате CASE;
  • WHEN when_expression — выражение, с которым сравнивается input_expression, в случае с простым форматом. Тип данных when_expression должен быть такой же, как и у input_expression, или хотя бы неявно преобразовываться;
  • THEN result_expression — выражение, которое будет возвращено, если текущее условие выполняется;
  • ELSE else_result_expression – дополнительный параметр ELSE, который предназначен для случаев, когда ни одно из перечисленных в CASE условий не выполнилось. Это необязательный параметр. Если ELSE не указано, а условия не выполнились, вернётся NULL;
  • WHEN Boolean_expression — логическое выражение, используемое в поисковом формате CASE, которое служит для вычисления результата. Это своего рода проверочное условие и таких условий может быть несколько.

CASE возвращает результат первого выражения (THEN result_expression), условие которого выполнилось, т.е. WHEN возвращает TRUE. Таким образом, если CASE содержит несколько эквивалентных условий WHEN, которые будут возвращать TRUE, вернется результат (указанный в THEN) первого выражения.

Тип данных возвращаемого результата выражением CASE, будет соответствовать наиболее приоритетному типу данных из набора типов в выражениях result_expressions и else_result_expression.

Примеры CASE в Transact-SQL

Сейчас давайте рассмотрим несколько примеров использования выражения CASE, но сначала разберем исходные данные, которые я буду использовать в примерах, чтобы было более понятно и наглядно.

Исходные данные для примеров

Допустим, что у нас есть таблица с товарами, она имеет следующую структуру и данные.

   
   --Создание таблицы
   CREATE TABLE TestTable(
        [ProductId]     [INT] IDENTITY(1,1) NOT NULL,
        [ProductName]   [VARCHAR](100) NOT NULL,
        [Price]                 [Money] NULL
   )
   GO
   --Добавление строк в таблицу
   INSERT INTO TestTable(ProductName, Price)
           VALUES ('Системный блок', 300),
                      ('Монитор', 200),
                          ('Клавиатура', 100),
                          ('Мышь', 50),
                          ('Принтер', 200)
   GO
   --Выборка данных
   SELECT * FROM TestTable

Скриншот 2

Примечание! Если Вы начинающий программист и не знаете, что делает вышеуказанная инструкция, то рекомендую Вам почитать мою книгу, посвященную основам языка Transact-SQL – «Путь программиста T-SQL» – это своего рода самоучитель по языку Transact-SQL, в котором я очень подробно рассказываю обо всех конструкциях языка, начиная с простых и заканчивая продвинутыми.

Пример простого выражения CASE в инструкции SELECT

В этом примере мы проверяем значение столбца ProductId, если оно равняется одному из перечисленных значений в выражении WHEN, то будет выводиться соответствующее значение из выражения THEN. Если нам встретится значение, которого мы не указали, CASE вернет пусто, т.е. значение из ELSE.

   
   --Простое выражение CASE
   SELECT CASE ProductId WHEN 1 THEN 'Один'
                                          WHEN 2 THEN 'Два'
                                          WHEN 3 THEN 'Три'
                                          WHEN 4 THEN 'Четыре'
                                          WHEN 5 THEN 'Пять'
                                          ELSE '' 
           END AS IdText,
                
           ProductId, ProductName, Price

   FROM TestTable

Скриншот 3

Пример поискового выражения CASE в инструкции SELECT

Следующий запрос эквивалентен предыдущему, но в нем используется уже поисковый формат CASE.

   
   --Пример поискового выражения CASE
   SELECT CASE WHEN ProductId = 1 THEN 'Один'
                        WHEN ProductId = 2 THEN 'Два'
                        WHEN ProductId = 3 THEN 'Три'
                        WHEN ProductId = 4 THEN 'Четыре'
                        WHEN ProductId = 5 THEN 'Пять'
                        ELSE '' 
           END AS IdText,
                
           ProductId, ProductName, Price

   FROM TestTable

Скриншот 4

Как видим, результат точно такой же.

Давайте немного усложним запрос, добавим в него некий анализ цены (Price). Также я здесь покажу, что в случае, если по факту у нас может выполниться несколько условий, результат будет возвращен первого выражения с TRUE (т.е. условие выполнилось), выражения, идущие после, не обрабатываются.

   
   --Пример поискового выражения CASE
   SELECT CASE WHEN Price > 100 THEN 'Больше 100'
                        WHEN Price = 100 THEN 'Равно 100'
                        WHEN Price < 100 THEN 'Меньше 100'
                        WHEN Price = 300 AND ProductId = 1 THEN 'Цена равна 300 и Id равен 1'
                        ELSE 'Нет подходящего условия' 
           END AS IdText,
                
           ProductId, ProductName, Price

   FROM TestTable

Скриншот 5

Как видите, условие WHEN Price = 300 AND ProductId = 1 с виду выполняется, но CASE вернул результат первого выражения, после которого анализ был прекращен, и дело до следующих условий не дошло.

Пример выражения CASE в инструкции SET

Как я уже отмечал, CASE можно использовать во многих инструкциях, например, в SET для установки значений переменных. В следующем примере мы проверяем значение одной переменной, чтобы записать соответствующее текстовое значение в другую переменную.

Примечание! Про основы программирования на языке T-SQL в Microsoft SQL Server можете почитать в материале «Основы программирования на T-SQL».

   
   --Пример выражения CASE в инструкции SET
   DECLARE @TestVar VARCHAR(10);
   DECLARE @Id INT = 1;

   SET @TestVar = CASE WHEN @Id = 1 THEN 'Один'
                                        WHEN @Id = 2 THEN 'Два'
                                        WHEN @Id = 3 THEN 'Три'
                                        ELSE ''
                                END;

   SELECT @TestVar AS TestVar

Скриншот 6

У меня на этом все, пока!

Понравилась статья? Поделиться с друзьями:
Заметки IT специалиста
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:
Нажимая на кнопку «Отправить комментарий», я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.