Разное

Синтаксис case sql: Выражение CASE (Transact-SQL) — SQL Server

Содержание

Условные функции | Документация ClickHouse

  1. Справка по SQL
  2. Функции

if

Условное выражение. В отличии от большинства систем, ClickHouse всегда считает оба выражения then и else.

Синтаксис

SELECT if(cond, then, else)

Если условие cond не равно нулю, то возвращается результат выражения then. Если условие cond равно нулю или является NULL, то результат выражения then пропускается и возвращается результат выражения else.

Параметры

  • cond – Условие, которое может быть равно 0 или нет. Может быть UInt8 или NULL.
  • then — Возвращается результат выражения, если условие cond истинно.
  • else — Возвращается результат выражения, если условие cond ложно.

Возвращаемые значения

Функция выполняет выражения then или else и возвращает его результат, в зависимости от того, было ли условие cond равно нулю или нет.

Пример

Запрос:

SELECT if(1, plus(2, 2), plus(2, 6))

Ответ:

┌─plus(2, 2)─┐
│          4 │
└────────────┘

Запрос:

SELECT if(0, plus(2, 2), plus(2, 6))

Ответ:

┌─plus(2, 6)─┐
│          8 │
└────────────┘

Тернарный оператор

Работает так же, как функция if.

Синтаксис: cond ? then : else

Возвращает then, если cond верно (больше нуля), в остальных случаях возвращает else.

  • cond должно быть типа UInt8, then и else должны относиться к наименьшему общему типу.

  • then и else могут быть NULL.

Смотрите также

multiIf

Позволяет более компактно записать оператор CASE в запросе.

multiIf(cond_1, then_1, cond_2, then_2...else)

Параметры

  • cond_N — Условие, при выполнении которого функция вернёт then_N.
  • then_N — Результат функции при выполнении.
  • else — Результат функции, если ни одно из условий не выполнено.

Функция принимает 2N+1 параметров.

Возвращаемые значения

Функция возвращает одно из значений then_N или else, в зависимости от условий cond_N.

Пример

Рассмотрим таблицу

┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
│ 2 │    3 │
└───┴──────┘

Выполним запрос SELECT multiIf(isNull(y), x, y < 3, y, NULL) FROM t_null. Результат:

┌─multiIf(isNull(y), x, less(y, 3), y, NULL)─┐
│                                          1 │
│                                       ᴺᵁᴸᴸ │
└────────────────────────────────────────────┘

Оригинальная статья

Трюки в SQL – используем CASE

После серии статей “Основы SQL” я решил попробовать вспомнить некоторые нестандартные варианты использования Transact-SQL и начать серию статей “Трюки в SQL”.

В этой статье расскажу прежде всего о полезном но неочевидном использовании выражения CASE. Правда, речь пойдет о достаточно простых приемах (когда их знаешь). Основное содержание:

База данных для примеров

Если в прошлой серии я использовал максимально простую БД, которую создал и наполнил скриптами, то теперь я решил использовать стандартные примеры от Microsoft. Причина в том, что потребуются более сложные структуры и данные, да и примеры станут ближе к реальной жизни.

Поэтому для запуска примера потребуется БД AdventureWorks. Я пользовался облегченной версией для Microsoft SQL Server 2005 (там, в зависимости от версии, можно выбрать AdventureWorksLT.msi или AdventureWorksLT_x64.msi). Скорее всего, подойдут и более поздние версии с CodePlex.

План выполнения

Расскажу на случай, если вы не знаете про план выполнения. В этой статьях этой серии он будет периодически упоминаться. Это пятилетний план выполнения… шутка, надеюсь вашим запросам никогда не придется так долго работать 🙂

Если серьезно и не вдаваясь в подробности, движку базы данных необходимо знать, в какой последовательности и каким способом соединять таблицы, какие индексы использовать и т.п. Иными словами, перед выполнением запроса необходимо построить (или взять из кэша) план выполнения.

Актуальный план выполнения вы можете посмотреть в SSMS (SQL Server Management Studio), выбрав его в пункте меню “Query / Include Actual Execution Plan” или нажав “Ctrl+M”. В результате, после выполнения пакета запросов вы увидите вкладку “Execution Plan”, в которой для каждого запроса из пакета будет выведен план выполнения в графическом виде.

Анализ планов выполнения это отдельная интересная тема, быть может, когда-нибудь расскажу и об этом. Пока же, если вам интересна эта тема (ее просто необходимо знать, если всерьез заниматься оптимизацией запросов), можете почитать соответствующий раздел MSDN. Заодно имеет смысл прочитать про кэширование планов выполнения.

Синтаксис CASE

На всякий случай напомню синтаксис “CASE”, поскольку его используют сравнительно редко:

-- простой вариант: 
CASE input_expression
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
-- усложненный вариант:
CASE
WHEN Boolean_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END

Хочу обратить ваше внимание на то, что “ELSE” можно не указывать, тогда, в случае отсутствия соответствующего “WHEN” вернется NULL.

Также имеет смысл отметить, что возвращаемые значения должны быть совместимы. То есть, так написать можно:

SELECT CASE WHEN 1=1 THEN '0' ELSE 1 END

А так уже нет:

SELECT CASE WHEN 1=1 THEN 'A' ELSE 1 END

Обратите внимание: то же правило, как нетрудно догадаться, работает не только для констант, но и для столбцов таблиц. Так что будьте бдительны – ваш запрос может работать на одних данных (скажем, когда код товара хранится в строке, но содержит только цифры) и не работать на других (добавили в код товара буквы).

SUM по CASE

Итак, на первом месте, по праву – суммирование с условием внутри (возвращающим 0 или 1). Этот прием позволяет вместо нескольких однотипных запросов написать один и, что часто бывает, неплохо улучшить производительность.

Пример несколько синтетический, зато простой – представьте, что нужно периодически узнавать общее количество товаров, а также количество красных и черных товаров. Так можно решить задачу “в лоб”:

SELECT COUNT(*) FROM SalesLT.Product
SELECT COUNT(*) FROM SalesLT.Product WHERE Color = 'Red'
SELECT COUNT(*) FROM SalesLT.Product WHERE Color = 'Black'

А так, используя “SUM по CASE”:

SELECT COUNT(*) AS TotalCount,
SUM(CASE WHEN Color = 'Red' THEN 1 ELSE 0 END) AS RedCount,
SUM(CASE WHEN Color = 'Black' THEN 1 ELSE 0 END) AS BlackCount
FROM SalesLT.Product

Если в SSMS (SQL Server Management Studio) включить вывод актуального плана выполнения, то можно увидеть, что стоимость последнего запроса в два раза меньше, чем суммарная стоимость первых трех.

В качестве лирического отступления – хорошее понимание работы Microsoft SQL Server мне чаще всего грело душу тогда, когда после “неплохого” улучшения производительности запроса, он начинал выполняться в десятки раз быстрее. И еще один интересный факт – мы с моим коллегой (администратором SQL) не сговариваясь заранее сошлись во мнении, что свободное оперирование “SUM по CASE” говорит о хорошем знании SQL. Так что я вам только что рассказал один из секретов, как сойти за знатока SQL 🙂

ORDER по CASE

Раз уж заговорили про группировку с “CASE”, то стоит упомянуть и сортировку, как правильно мне напомнили в одном из комментариев. Здесь все довольно просто – в “ORDER BY” (как и в “WHERE”, “GROUP BY” и т.п.) мы тоже можем использовать “CASE”, что дает возможность делать более интеллектуальную сортировку.

Хорошим примером будет таблица с категориями товаров (двух-уровневое дерево). Давайте подумаем, как нам вывести эту таблицу как дерево (сначала родительский элемент, потом все его дочерние, потом следующий родительский и т.д.). Если мы будем использовать запрос без сортировки или с сортировкой по родительской категории, то получим сначала все родительские элементы.

Теперь попробуем с “CASE”:

SELECT * FROM SalesLT.ProductCategory 
ORDER BY CASE WHEN ParentProductCategoryID IS NULL
THEN ProductCategoryID
ELSE ParentProductCategoryID END, ProductCategoryID

Уже лучше. Однако нам, если разобраться, просто повезло с порядком идентификаторов. Если мы отсортируем дочерние элементы по названию, то сразу увидим в чем проблема.

Для того, чтобы правильно сортировать строки внутри каждой родительской группы нам потребуется еще один маленький трюк:

SELECT * FROM SalesLT.ProductCategory 
ORDER BY CASE WHEN ParentProductCategoryID IS NULL
THEN ProductCategoryID
ELSE ParentProductCategoryID END,
CASE WHEN ParentProductCategoryID IS NOT NULL
THEN Name END
Резюме

Надеюсь, вам было интересно узнать эти приемы или освежить память о них.

В предыдущей серии статей я старался объяснить связанные базовые понятия, что сильно увеличивало объем статей. Теперь, по идее, должны получаться сравнительно короткие (и при этом вполне законченные) статьи, которые, по моему мнению, значительно удобнее читать.

Если у вас есть замечания, пожелания или новые темы – пишите в комментариях или на olegaxenow.reformal.ru. Постараюсь учесть.

sql — Оператор CASE в предложении Where с использованием оператора Like

Я столкнулся с проблемой использования выражения CASE в предложении where, насколько мне известно, синтаксис правильный, но получаю ошибку. Ниже мой код:

Where
CASE 
            WHEN (@ItemFor='' and @ItemTo='')
            THEN id like '%'
            ELSE id between @ItemFor and @ItemTo
        END

Выше код выглядит правильно для меня, но я получаю синтаксическую ошибку, говоря

Неверный синтаксис рядом с ключевым словом «нравится».

Редактировать

У меня есть 4 набора параметров, и все они должны перейти к предложению where, и все они являются строковыми значениями:

WHERE

        CASE 
            WHEN (@ItemFor='' and @ItemTo='')
                THEN id like '%'
                ELSE id between @ItemFor and @ItemTo
        END
    AND 
        CASE 
            WHEN (@CodeFrom='' and @CodeTo='')
            THEN Code like '%'
            ELSE code between @CodeFrom and @CodeTo
        END

0

Siva

27 Июл 2018 в 14:07

7 ответов

Лучший ответ

Вы можете упростить и использовать это условие:

WHERE ((@ItemFor='' and @ItemTo='' AND id like '%') OR id between @ItemFor and @ItemTo)
  AND ((@CodeFrom='' and @CodeTo='' AND Code like '%') OR code between @CodeFrom and @CodeTo)

И теперь синтаксис правильный.

Более того, id like '%' и Code like '%' не имеют смысла, потому что они всегда верны. Их можно прочитать как «проверьте, является ли id (или Code) чем-либо», поэтому они могут (должны) быть удалены.

2

Michał Turczyn
27 Июл 2018 в 11:22

Вам не нужно выражение case для этого. Просто делать:

where ((@ItemFor = '' and @ItemTo = '') or
       id between @ItemFor and @ItemTo
      )

Ваша версия не работает, потому что SQL Server не имеет логических переменных. Ваше выражение case пытается вернуть логическое выражение, но такое выражение не является значением.

Кстати, вы, вероятно, намереваетесь:

where (id >= @itemfrom or @itemfrom = '') and
      (id <= @itemto or @itemto = '')

Это позволяет установить только одно из ограничений.

5

Gordon Linoff
27 Июл 2018 в 11:10

Я думаю, что ваша область ошибок

WHERE

    CASE 
        WHEN (@ItemFor='' and @ItemTo='')
            THEN id like '%'                  -------conditional operator in result
            ELSE id between @ItemFor and @ItemTo ---------- conditional operator
    END
AND 
    CASE 
        WHEN (@CodeFrom='' and @CodeTo='')
        THEN Code like '%'
        ELSE code between @CodeFrom and @CodeTo  -------------conditional operator
    END

Вы можете попробовать ниже путь

WHERE    
case when (@ItemFor='' and @ItemTo='') and id like '%' 
Then (case when id >=@ItemFor and id<=@ItemTo then id else end)
Else 
case when (@CodeFrom='' and @CodeTo='') and Code like '%' 
Then (case when code >=@ItemFor and code<=@ItemTo then code else end)
end

0

Zaynul Abadin Tuhin
27 Июл 2018 в 11:26

Попробуй это:

WHERE

CASE 
    WHEN (@ItemFor='' AND @ItemTo='') THEN 1
    WHEN (id between @ItemFor and @ItemTo) THEN 1
    WHEN (@CodeFrom='' and @CodeTo='') THEN 1
    WHEN (code between @CodeFrom and @CodeTo) THEN 1
    ELSE 0
END = 1

0

akshay
27 Июл 2018 в 11:37

Попробуйте этот подход вместо этого.

where (@itemFor='' and @itemto='') OR (id between @itemFor and @itemto)

Делать так же, как ваш кейс-кейс. Если обе переменные пусты, не фильтруйте предложение ID. Если переменные заполнены, проверьте идентификатор в диапазоне

Обратите внимание, что если вы выполняете несколько условий, я бы предложил добавить дополнительные скобки, такие как

where ( (@itemFor='' and @itemto='') OR (id between @itemFor and @itemto) )
   and (firstName like '%JOE%')

Др

1

Sparky
27 Июл 2018 в 11:17

Это может решить вашу проблему:

WHERE 
((@ItemFor = '' and @ItemTo = '' and id like '%') 
or (@ItemFor <> '' and @ItemTo <> '' and id between @ItemFor and @ItemTo))      
AND 
((@CodeFrom = '' and @CodeTo = '' and Code like '%')
 or (@CodeFrom <> '' and @CodeTo <> '' and code between @CodeFrom and @CodeTo))

2

Ajay Gupta
27 Июл 2018 в 11:22

Поскольку CASE не может вернуть логическое значение, вам придется вернуть что-то еще и сравнить:

WHERE
  CASE
    WHEN Condition1 THEN 1
    WHEN Condition2 THEN 0
    WHEN Condition3 THEN 1
    ELSE 0
  END = 1

1

Amy B
27 Июл 2018 в 11:14

51556688

Иллюстрированный самоучитель по PostgreSQL › SQL в PostgreSQL › Конструкции CASE [страница — 92] | Самоучители по программированию

Конструкции CASE

Чтобы программа SQL могла принимать простейшие решения, не прибегая к процедурным языкам, в PostgreSQL поддерживаются конструкции CASE, предусмотренные стандартом SQL Ключевые слова SQL CASE, WHEN, THEN и END позволяют выполнять простые условные преобразования записей.

Вся конструкция CASE включается в целевой список команды SELECT. По умолчанию итоговому полю конструкции CASE присваивается имя case, но ему можно назначить синоним, как любому обычному полю. Общий синтаксис конструкции CASE в списке целей команды SELECT выглядит следующим образом:

CASE WHEN условие! THEN результат! WHEN условие2 THEN результат2
[… ]
[ ELSE результат_по_умопчанию END [ AS синоним ]

Конструкция CASE-WHEN-THEN-ELSE отчасти напоминает условные команды if-then-else в традиционных языках программирования (листинг 4.50). Условия секций WHEN должны возвращать логический результат.

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

Листинг 4.50. Конструкции CASE в командах.

booktown=# SELECT isbn,
booktown-# CASE WHEN cost > 20 THEN 'over $20.00 cost'
booktown-# WHEN cost = 20 THEN '$20.00 cost1
booktown-# ELSE 'under $20.00 cost'
booktown-# END AS cost_range
booktown-# FROM stock
booktown-# LIMIT 8;
Isbn | cost_range
0385121679 | over $20.00 cost
039480001X | over $20.00 cost
044100590X | over $20.00 cost
0451198492 | over $20.00 cost
0394900014 | over $20.00 cost
0441172717 | under $20.00 cost
0451160916 | over $20.00 cost
0679803335 | $20.00 cost
(8 rows)

Подзапросы PostgreSQL расширяют возможности конструкций CASE (см. раздел «Подзапросы»). Как показано в листинге 4.51, в качестве результата условного выражения в конструкции может быть задан подзапрос.

Листинг 4.51. Конструкции CASE в подзапросах.

booktown=# SELECT isbn,
booktown-# CASE WHEN cost > 20 THEN 'N/A – (Out of price range)'
booktown-# ELSE (SELECT title FROM books b JOIN editions e
booktown(# ON (b.id = e.book_id)
booktown(# WHERE e.isbn = stock.isbn)
booktown-# END AS cost_range
booktown-# FROM stock
booktown-# ORDER BY cost_range ASC
booktown-# LIMIT 8;
isbn | cost_range
0451457994 | 2001: A Space Odyssey
0394800753 | Bartholomew and the Oobleck
0441172717 | Dune
0760720002 | Little Women
0385121679 | N/A – (Out of price range)
039480001X | N/A – (Out of price range)
044100590X | N/A – (Out of price range)
0451198492 | N/A – (Out of price range)
(8 rows)

Для всех книг, цена которых не превышает 20, запрос возвращает название книги (подзапрос к таблице books) и код ISBN (основной запрос к таблице stock).

НОУ ИНТУИТ | Лекция | Выражения в Oracle SQL

Аннотация: Рассматривается построение выражений для использования в операциях выборки данных SELECT и изменения данных INSERT, UPDATE и DELETE.

Общие элементы запросов и предложений DML: выражения

Готовые приложения, как правило, работают с данными уже существующих таблиц. Основная группа предложений SQL, используемых в работающих приложениях, — это SELECT для выборки и операторы DML для изменения данных таблиц. При всем их синтаксическом различии операторы этой группы роднит использование выражений, составляемых по одним и тем же одинаковым правилам.

В общем случае выражение строится на основе более простых выражений с помощью операторов, функций и прочих конструкций. Началом же для построения любого выражения служат «элементарные», исходные значения, далее не раскрываемые, указанные напрямую тем или иным способом.

Исходные значения

Исходные значения лежат в основе любого выражения в составе оператора DML или запроса на SQL. Это такие подвыражения, которые при анализе не разложимы далее на другие подвыражения. Исходные значения могут быть сообщены выражению:

  • явно,
  • через «системные переменные»,
  • именем поля строки таблицы.
Явно обозначенные величины («литералы»)

Для явно обозначенных величин (values) в русской литературе часто используется калька с американского английского: «литералы». Оригинальное слово literal представляет собой возникшее со временем в североамериканской литературе жаргонное сокращение от literal value, что дословно означает напрямую («буквально») указанную в тексте величину (средневековое английское значение слова literal не имеет никакого отношения к компьютерному).

Нелишне помнить, что одни и те же величины часто могут быть обозначены по-разному, например, 1 и +1 и так далее (в известном «треугольнике Фреге» предмет — обозначение — смысл literal value скорее «обозначение»). Для разных видов данных в выражениях предусмотрены разные способы обозначения.

Числовые величины

Примеры обозначения целых чисел:

Примеры обозначения «десятичных» чисел (decimal), иначе чисел с возможной дробной частью, записанных в десятичной системе счисления:

Отделение целой части от дробной осуществляется с помощью десятичной точки или же запятой, в зависимости от установок местности («языковых»). Русский формат записи чисел (в Oracle устанавливается параметром сеанса NLS_NUMERIC_CHARACTERS как ‘, ‘) унаследовал исторически французскую традицию употребления в качестве разделителя запятую в отличие от английской точки, унаследованной Северной Америкой как местом разработки СУБД Oracle. Если не обращать внимания на эту мелочь, могут возникать ошибки вывода числовых данных из БД.

В записи рациональных чисел могут присутствовать в служебных целях форматирующие буквы:

49, 18.47, -34e2, 0.16e4, 4e-3, 4e-3, 
123f (явное указание BINARY_FLOAT), 
-123.25d (явное указание BINARY_DOUBLE)

Регистр букв, как обычно, не имеет значения.

Проверить, как Oracle воспринимает указанные в выражениях значения, можно с помощью служебной функции DUMP.

Пример для всех версий:

SQL> SELECT 1000, DUMP ( 1000 ) FROM dual;
      1000 DUMP(1000)          
---------- ------------------- 
      1000 Typ=2 Len=2: 194,11 
Пример для версий 10+:
SQL> SELECT 123f, DUMP ( 123f ), DUMP ( 123d ) FROM dual;
      123F DUMP(123F)                 DUMP(123D)
---------- -------------------------- -----------------------------------
 1.23E+002 Typ=100 Len=4: 194,246,0,0 Typ=101 Len=8: 192,94,192,0,0,0,0,0

В качестве упражнения предлагается выполнить другие проверки, например, при записи числа как 1000.1 и 1.0e+3.

Строки текста

Примеры указания строк:

'Collins', '''tis' (кавычки в кавычках), '!?-@ ', '', '''', '1234'
n'Многобайтовая кодировка; по правилам ANSI можно писать и N, и n', 
n'Тоже многобайтовая кодировка'
q'[Строка без 'искажений'. Возможно начиная с версии 10]',  
q'|ограничивающий символ может быть практически любой|'
u'строка в Unicode начиная с версии 10'

Функция DUMP помогает понять, как воспринимает СУБД по-разному оформленные строки. Последние два предложения SELECT работают начиная с версии 10:

SQL> SELECT 'a''bc', DUMP ( 'a''bc' ) FROM dual;
'A'' DUMP('A''BC')
---- -------------------------
a'bc Typ=96 Len=4: 97,39,98,99
SQL> SELECT 'a''bc', DUMP ( q'wa'bcw' ) FROM dual;
'A'' DUMP(Q'WA'BCW')
---- -------------------------
a'bc Typ=96 Len=4: 97,39,98,99
SQL> SELECT 'a''bc', DUMP ( nq'wa'bcw' ) FROM dual;
'A'' DUMP(NQ'WA'BCW')
---- ---------------------------------
a'bc Typ=96 Len=8: 0,97,0,39,0,98,0,99
Моменты и интервалы времени

Начиная с версии 9 в Oracle поддерживается система указаний моментов и интервалов времени, принятая для SQL комитетами ANSI/ISO по стандартизации SQL. Использованный в примерах ниже формат указания самого значения жестко регламентирован ANSI/ISO. Это касается и типа DATE, для которого Oracle принимает формулировку из стандарта, но по-своему раскрывает ее содержание.

Для обозначения моментов времени используются конструкции DATE, TIME и TIMESTAMP.

Примеры:

DATE '2003-04-14' 
  (14 апреля 2003 00:00:00; имеет тип DATE, а временная компонента обнулена)
TIME '12:30:45' 
  (12.30.45.000000000 пополудни; тип не играет самостоятельной роли в БД и может использоваться только в выражении)
TIMESTAMP '2003-04-14 15:16:17' 
  (14 апреля 2003 15:16:17.000000000; этот и следующий пример имеет тип TIMESTAMP ( 9 ) )
TIMESTAMP '2003-04-14 15:16:17.88' 
  (14 апреля 2003 15:16:17.880000000)
TIMESTAMP '1997-01-31 09:26:56.66 +02:00' 
  (31 января 1997 09:26:56.660000000 во второй временной зоне; имеет тип TIMESTAMP ( 9 ) WITH TIME ZONE)
TIMESTAMP '1997-01-31 09:26:56.66 Europe/Moscow' 
  (31 января 1997 09:26:56.660000000 во временной зоне г. Москвы; имеет тип TIMESTAMP ( 9 ) WITH TIME ZONE)

Для обозначения интервалов времени используются конструкции INTERVAL, допускающие указание подынтервалов «грубого» и «точного» диапазона интервалов и, в дополнение к синтаксису ANSI/ISO, указание точности. Деление на «грубые» и «точные» диапазоны условно. Примеры формулирования «точных» интервалов (диапазон от дней до долей секунд и подынтервалы):

INTERVAL '5 04:03:02.01' DAY TO SECOND 
  (5 дней, 4 часа, 3 минуты, 2,01 секунды; имеет тип INTERVAL DAY ( 2 ) TO SECOND ( 6 )),
INTERVAL '04:03' HOUR TO MINUTE 
  (0 дней, 4 часа, 3 минуты; этот и следующий пример имеет тип INTERVAL DAY ( 2 ) TO SECOND ( 0 )),
INTERVAL '03' MINUTE 
  (0 дней, 0 часов, 3 минуты)

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

Примеры формулирования «грубых» интервалов (диапазон из лет и месяцев и два подынтервала):

INTERVAL '04-5' YEAR TO MONTH 
  (плюс 4 года и 5 месяцев; этот и два следующих примера имеют тип INTERVAL YEAR ( 2 ) TO MONTH),
INTERVAL '-4' YEAR 
  (минус 4 года),
INTERVAL '5' MONTH 
  (плюс 5 месяцев)

Во всех перечисленных случаях жесткость формата для указания значения не догматична предельно: ведущие нули и пробелы между лексемами роли не играют. Например, один из предыдущих интервалов с равным успехом мог бы быть записан следующим образом:

INTERVAL ' + 4- 0005 ' YEAR TO MONTH

Оператор Case в MySQL

есть таблица ‘tbl_transaction С

id INT(11) Primary Key
action_type ENUM('Expense', 'Income')
action_heading VARCHAR (255)
action_amount FLOAT

можно ли получить результат, используя только SQL-запрос, перечисляющий всю сумму расходов в столбце расходов Amt и сумму дохода в столбце доходов Amt, например:

ID        Heading         Income Amt       Expense Amt
1         ABC             1000             -
2         XYZ             -                2000

Я использую MySQL в качестве базы данных. И я пытаюсь использовать CASE statement.

Ура!

46

автор: Pradip Kharbuja

6 ответов


Да, что-то вроде этого:

SELECT
    id,
    action_heading,
    CASE
        WHEN action_type = 'Income' THEN action_amount
        ELSE NULL
    END AS income_amt,
    CASE
        WHEN action_type = 'Expense' THEN action_amount
        ELSE NULL
    END AS expense_amt

FROM tbl_transaction;

как указывали другие ответы, MySQL также имеет IF() функция для этого использует менее подробный синтаксис. Я обычно пытаюсь избежать этого, потому что это специфичное для MySQL расширение для SQL, которое обычно не поддерживается в другом месте. CASE является стандартным SQL и гораздо более переносимым для разных ядер баз данных, и я предпочитаю писать переносимые запросы как можно больше, ТОЛЬКО используя расширения для конкретных движков, когда портативная альтернатива значительно медленнее или менее удобно.


MySQL также имеет IF():

SELECT 
  id, action_heading, 
      IF(action_type='Income',action_amount,0) income, 
      IF(action_type='Expense', action_amount, 0) expense
FROM tbl_transaction

20

автор: Bart Friederichs


попробуйте использовать IF(condition, value1, value2)

SELECT ID, HEADING, 
IF(action_type='Income',action_amount,0) as Income,
IF(action_type='Expense',action_amount,0) as Expense

Это должно работать:

select 
  id
  ,action_heading
  ,case when action_type='Income' then action_amount else 0 end
  ,case when action_type='Expense' then expense_amount else 0 end
from tbl_transaction

2

автор: Dumitrescu Bogdan


другое дело, иметь в виду, что есть два разных случая с MySQL: одним нравится то, что @cdhowie и другие здесь описывают (и документально здесь: http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case) и то, что называется случай, но имеет совершенно иной синтаксис и совершенно иные функции, подтвержденные документально здесь: https://dev.mysql.com/doc/refman/5.0/en/case.html

неизменно, я сначала использую один, когда я хочу другую.


Я надеюсь, что это предоставит вам правильное решение:

синтаксис:

   CASE  
        WHEN search_condition THEN statement_list  
       [WHEN search_condition THEN statement_list]....
       [ELSE statement_list]  
   END CASE

реализация:

select id, action_heading,  
   case when
             action_type="Expense" then action_amount  
             else NULL   
             end as Expense_amt,   
    case when  
             action_type ="Income" then action_amount  
             else NULL  
             end as Income_amt  
  from tbl_transaction;

здесь я использую CASE заявление, поскольку оно более гибкое, чем if-then-else. Это позволяет более одной ветви. И CASE оператор является стандартным SQL и работает в большинстве баз данных.

0

автор: Sushmita Konar


sql-docs.ru-ru/case-statement-mdx.md at live · MicrosoftDocs/sql-docs.ru-ru · GitHub

descriptiontitlems.datems.prodms.technologyms.customms.topicms.authorms.reviewerauthorms.openlocfilehashms.sourcegitcommitms.translationtypems.contentlocalems.lasthandoffms.locfileid

Инструкция CASE (многомерные выражения)

CASE, инструкция (многомерные выражения) | Документация Майкрософт

06/04/2018

sql

analysis-services

mdx

reference

owend

owend

minewiskan

7a5907eb58fa102c46fa22af97116c4fad0f217a

e700497f962e4c2274df16d9e651059b42ff1a10

MT

ru-RU

08/17/2020

88466506

Позволяет возвращать указанные значения из нескольких сравнений согласно условию. Существуют два типа инструкции CASE.

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

  • Инструкция CASE для поиска, вычисляющая набор выражений логического типа и возвращающая определенные значения.

Синтаксис

  
Simple Case Statement  
CASE [input_expression]  
WHEN when_expression THEN when_true_result_expression  
[...n]  
[ELSE else_result_expression]  
END  
  
Search Case Statement  
CASE   
WHEN Boolean_expression THEN when_true_result_expression  
[...n]  
[ELSE else_result_expression]  
END  

Аргументы

input_expression
Многомерное выражение, результатом вычисления которого является скалярное значение.

when_expression
Заданное скалярное значение, для которого вычисляется input_expression , при вычислении которого принимается значение true, возвращает скалярное значение else_result_expression.

when_true_result_expression
Скалярное значение, которое возвращается, если результатом предложения WHEN является TRUE.

else_result_expression
Скалярное значение, возвращаемое в том случае, если при вычислении ни одно из предложений WHEN не вернуло TRUE.

Boolean_expression
Многомерное выражение, результатом вычисления которого является скалярное значение.

Комментарии

Если нет предложения ELSE, а все предложения WHEN дали значение false, тогда результатом будет пустая ячейка.

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

MDX вычисляет простое выражение CASE, разрешающее input_expression скалярному значению. Это скалярное значение затем сравнивается с скалярным значением when_expression. Если два скалярных значения совпадают, оператор CASE возвращает значение when_true_expression. Если скалярные значения не совпадают, вычисляется следующее предложение WHEN. Если все предложения WHEN имеют значение false, то возвращается значение else_result_expression из предложения Else (при наличии).

В следующем примере значение меры Reseller Order Count сравнивается в нескольких предложениях WHEN и возвращается результат, зависящий от значения меры Reseller Order Count в каждом году. Для числа заказов торгового посредника, которые не соответствуют скалярному значению, указанному в when_expression в предложении WHEN, возвращается скалярное значение else_result_expression .

WITH MEMBER [Measures].x AS   
CASE [Measures].[Reseller Order Count]  
   WHEN 0 THEN 'NONE'  
   WHEN 1 THEN 'SMALL'  
   WHEN 2 THEN 'SMALL'  
   WHEN 3 THEN 'MEDIUM'  
   WHEN 4 THEN 'MEDIUM'  
   WHEN 5 THEN 'LARGE'  
   WHEN 6 THEN 'LARGE'  
      ELSE 'VERY LARGE'  
END  
SELECT Calendar.[Calendar Year] on 0  
, NON EMPTY [Geography].[Postal Code].Members ON 1  
FROM [Adventure Works]  
WHERE [Measures].x  

Выражение CASE для поиска

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

В следующем примере мера «число заказов торгового посредника» вычисляется на основе указанного Boolean_expression для каждого из нескольких предложений WHEN. Возвращается результат, зависящий от значения меры Reseller Order Count в каждом году. Поскольку предложения WHEN вычисляются в том порядке, в котором они перечислены, всем значениям больше 6 можно легко присвоить значение «VERY LARGE», не указывая все значения явно. Для числа заказов торгового посредника, которые не указаны в предложении WHEN, возвращается скалярное значение else_result_expression .

WITH MEMBER [Measures].x AS   
CASE   
   WHEN [Measures].[Reseller Order Count] > 6 THEN 'VERY LARGE'  
   WHEN [Measures].[Reseller Order Count] > 4 THEN 'LARGE'  
   WHEN [Measures].[Reseller Order Count] > 2 THEN 'MEDIUM'  
   WHEN [Measures].[Reseller Order Count] > 0 THEN 'SMALL'  
   ELSE "NONE"  
END  
SELECT Calendar.[Calendar Year] on 0,  
NON EMPTY [Geography].[Postal Code].Members on 1  
FROM [Adventure Works]  
WHERE [Measures].x  

См. также

Инструкции для создания скриптов многомерных выражений (многомерные выражения)

Понимание оператора SQL Server CASE

Оператор SQL Server CASE эквивалентен оператору IF-THEN в Excel.

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

Оператор SQL Server CASE состоит как минимум из одной пары операторов WHEN и THEN. Оператор WHEN определяет условие, которое нужно проверить.Оператор THEN определяет действие, если условие WHEN возвращает TRUE.

Оператор ELSE является необязательным и выполняется, если ни одно из условий WHEN не возвращает true. Оператор CASE заканчивается ключевым словом END.

В этой статье мы рассмотрим несколько различных примеров оператора CASE. Но прежде чем мы это сделаем, мы создадим фиктивные данные для работы.

Создание фиктивных данных

Выполните следующий сценарий для создания фиктивных данных:

СОЗДАТЬ базу данных ShowRoom;

GO

USE ShowRoom;

СОЗДАТЬ ТАБЛИЦУ Автомобили

(

id INT,

имя VARCHAR (50) NOT NULL,

компания VARCHAR (50) NOT NULL,

мощность INT NOT NULL,

цвет NOTARCHAR (50) NULL,

модель INT NOT NULL,

условие VARCHAR (50) NOT NULL

)

Приведенный выше сценарий создал фиктивную базу данных под названием ShowRoom с одной таблицей в ней под названием Cars.В таблице Cars есть семь столбцов: идентификатор, имя, компания, мощность, цвет, модель и состояние.

Теперь давайте вставим фиктивные данные в таблицу Cars. Выполните следующий скрипт:

USE ShowRoom

INSERT INTO Cars

VALUES

(1, ‘Corrolla’, ‘Toyota’, 1800, ‘red’, 1995, ‘X’),

(2, ‘City’ , ‘Honda’, 1500, ‘black’, 2015, ‘X’),

(3, ‘C200’, ‘Mercedez’, 2000, ‘белый’, 1992, ‘X’),

(4, ‘ Vitz ‘,’ Toyota ‘, 1300,’ синий ‘, 2007 г.,’ X ‘),

(5,’ Baleno ‘,’ Suzuki ‘, 1500,’ белый ‘, 2012 г.,’ X ‘),

(6 , ‘C500’, ‘Mercedez’, 5000, ‘серый’, 1994, ‘X’),

(7, ‘800’, ‘BMW’, 8000, ‘синий’, 2016, ‘X’),

(8, ‘Мустанг’, ‘Форд’, 5000, ‘красный’, 1997, ‘Х’),

(9, ‘208’, ‘Пежо’, 5400, ‘черный’, 1999, ‘Х’),

(10, Prius, Toyota, 3200, красный, 2003, X)

Давайте проверим, как выглядит наш набор данных, выполним следующий скрипт:

Результат выглядит так:

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

Синтаксис оператора SQL Server CASE

Синтаксис оператора CASE довольно прост:

SELECT column1,

column2,

CASE WHEN CONDITION THEN ‘Value1’

ELSE ‘Value2’ END AS columnX

FROM Cars

Оператор CASE должен быть включен в оператор SELECT.Он начинается с ключевого слова CASE, за которым следует ключевое слово WHEN, а затем CONDITION.

Условием может быть любое допустимое выражение SQL Server, которое возвращает логическое значение. Например, условием может быть модель> 2000, предложение THEN используется после CONDITION. Если УСЛОВИЕ возвращает истину, значение, следующее за предложением THEN, сохраняется в столбцеX. В противном случае значение после предложения ELSE также будет сохранено в columnX. Оператор SQL Server CASE заканчивается предложением END.

Примеры операторов CASE

Давайте теперь посмотрим, как работает оператор CASE.

В предыдущем разделе мы создали таблицу с именем Cars в базе данных ShowRoom.

Столбец условия имел значение X для всех строк. Мы будем использовать оператор SQL Server CASE, чтобы установить значение столбца условия на «Новый», если столбец модели имеет значение больше 2000, в противном случае значение столбца условия будет установлено на «Старый».

Взгляните на следующий сценарий:

SELECT name,

model,

CASE WHEN model> 2000 THEN ‘New’

ELSE ‘Old’ END AS condition

FROM Cars

Приведенный выше сценарий отображает столбцы с названием, моделью и состоянием из таблицы Cars. Результат выполнения сценария выше выглядит следующим образом:

Вы можете видеть, что значение X в столбце состояния было заменено на «Новый» и «Старый» в зависимости от модели автомобиля.

Несколько условий в заявлении CASE

Вы можете оценить несколько условий в операторе CASE.

Напишем оператор SQL Server CASE, который устанавливает значение столбца условия в «Новое», если значение в столбце модели больше 2010, в «Среднее», если значение в столбце модели больше 2000, и в ‘ Старый ‘, если значение в столбце модели больше 1990.

Взгляните на следующий сценарий:

ВЫБРАТЬ имя,

модель,

ВАРИАНТ, КОГДА модель> 2010 ТОГДА «Новая»

КОГДА модель> 2000 ТОГДА «Средняя»

КОГДА модель> 1990 ТОГДА «Старая»

ELSE «Старая» КОНЕЦ условие

ОТ Автомобили

Результат выполнения сценария выше выглядит следующим образом:

В приведенном выше сценарии мы присвоили столбцу условия три разных значения в зависимости от значения в столбце модели.

Однако в приведенном выше сценарии условия перекрываются, поскольку. модель со значением выше 2010 также имеет значение больше 2000 и 1990. Лучший способ реализовать несколько условий — использовать логические операторы, такие как AND, OR, NOT и т. д. Посмотрите на следующий сценарий:

ВЫБРАТЬ имя,

модель,

ВАРИАНТ, КОГДА модель> 2010 ТОГДА «Новая»

КОГДА модель> 2000 И модель <2010 ТОГДА «Среднее»

КОГДА модель> 1990 И модель <2000 ТОГДА «Старая»

ELSE ‘Old’ END AS состояние

ИЗ Автомобили

Результат выполнения сценария выше выглядит следующим образом:

Мы также можем оценить несколько условий из разных столбцов, используя оператор SQL Server CASE.В следующем примере мы присвоим значение «New White» столбцу условия, где модель больше 2010 и цвет белый. Взгляните на следующий сценарий:

ВЫБЕРИТЕ имя,

цвет,

модель,

ВАРИАНТ, КОГДА модель> 2010 И цвет = ‘белый’ ТОГДА ‘Новый белый’

КОГДА модель> 2010 ТОГДА ‘Новая’

КОГДА модель> 2000 И модель < 2010 ТО «Среднее»

КОГДА модель> 1990 И модель <2000 ТОГДА «Старая»

ИНАЧЕ «Старая» КОНЕЦ состояние

ИЗ Легковые автомобили

Результат выглядит так:

Из строки 5 видно, что, поскольку цвет белый, а модель старше 2010, значение для столбца условия было установлено на «Новый белый» в выходных данных.

Использование GROUP BY с оператором CASE SQL Server

Оператор CASE также может использоваться вместе с оператором GROUP BY для применения агрегатных функций.

Например, если мы хотим подсчитать количество новых (номер модели больше 2000) и старых (номер модели меньше 2000) автомобилей, мы можем использовать предложение GROUP BY с оператором CASE следующим образом:

ВЫБРАТЬ

ВАРИАНТ, КОГДА модель> 2000 ТОГДА ‘Новый’

ELSE ‘Старое’ КОНЕЦ условие,

COUNT (1) AS count

FROM Cars

GROUP BY CASE WHEN model> 2000 THEN ‘New’

ELSE «Старый» END

В приведенном выше сценарии мы используем агрегатную функцию COUNT с оператором CASE.

Оператор SQL Server CASE устанавливает для столбца условия значение «Новое» или «Старое». Внутри предложения GROUP BY мы указываем, что соответствующий счетчик для «New» увеличивается на 1 всякий раз, когда встречается значение модели больше 2000. Раздел «Другое» означает, что мы увеличиваем счетчик «Старый» на 1, если значение модели равно 2000 или меньше. Результат выполнения сценария выше выглядит следующим образом:

Поскольку в нашем наборе данных пять автомобилей со значением «модель» больше 2000, вы можете увидеть 5 в столбце «Новые» автомобили.Точно так же у нас было 5 старых машин, и поэтому мы можем видеть 5 в столбце «Старые» машины.

Точно так же мы можем GROUP BY более двух значений. Взгляните на следующий сценарий:

ВЫБРАТЬ

ВАРИАНТ, КОГДА модель> 2010 ТОГДА «Новая»

КОГДА модель> 2000 ТОГДА «Средняя»

КОГДА модель> 1990 ТОГДА «Старая»

ELSE «Старая» КОНЕЦ КАК условие,

COUNT (1) КАК количество

ИЗ Автомобили

ГРУППА ПО ВАРИАНТУ КОГДА модель> 2010 ТОГДА «Новая»

КОГДА модель> 2000 ТОГДА «Средняя»

КОГДА модель> 1990 ТОГДА «Старая»

ELSE «Старая» КОНЕЦ

В приведенном выше скрипте мы сгруппировали данные по трем категориям: «Новые», «Средние» и «Старые».

Результат выглядит так:

Вы можете увидеть количество автомобилей в «Новом», «Среднем» и «Старом» состоянии.

Заключение

Оператор CASE пригодится, когда вы хотите реализовать логику IF-THEN в SQL Server. В этой статье мы увидели, что такое оператор CASE, а также его синтаксис. Мы также видели различные примеры оператора CASE вместе с его использованием с предложением GROUP BY.

Другие замечательные статьи от Ben

Бен Ричардсон руководит Acuity Training, ведущим поставщиком обучения SQL в Великобритании.Он предлагает полный спектр обучения SQL от вводных курсов до углубленного обучения администрированию и хранилищам данных — подробнее см. Здесь. У Acuity есть офисы в Лондоне и Гилфорде, графство Суррей. Он также иногда ведет блог в блоге Acuity

Посмотреть все сообщения Бена Ричардсона

Последние сообщения Бена Ричардсона (посмотреть все)

SQL CASE | Средний уровень SQL

Начиная с этого места? Этот урок является частью полного руководства по использованию SQL для анализа данных.Проверьте начало.

В этом уроке мы рассмотрим:

В следующих нескольких уроках вы будете работать с данными об игроках в американский футбол. Эти данные были собраны с ESPN 15 января 2014 года из списков, перечисленных на этой странице, с помощью скребка Python, доступного здесь. В этом конкретном уроке вы будете придерживаться информации о составе. Эта таблица довольно понятна — по одной строке на игрока со столбцами, описывающими атрибуты этого игрока. Запустите этот запрос, чтобы проверить необработанные данные:

  ВЫБРАТЬ * ОТ benn.College_football_players
  

Оператор SQL CASE

Оператор CASE — это способ SQL для обработки логики «если / то». За оператором CASE следует по крайней мере одна пара операторов WHEN и THEN — эквивалент IF / THEN в Excel в SQL. Из-за этого сочетания у вас может возникнуть соблазн назвать этот SQL CASE WHEN , но CASE является приемлемым термином.

Каждый оператор CASE должен заканчиваться оператором END .Оператор ELSE является необязательным и обеспечивает способ захвата значений, не указанных в операторах WHEN / THEN . CASE проще всего понять в контексте примера:

  ВЫБЕРИТЕ player_name,
       год,
       СЛУЧАЙ, КОГДА год = 'SR' ТОГДА 'да'
            ELSE NULL END AS is_a_senior
  ОТ benn.college_football_players
  

Проще говоря, вот что происходит:

  1. Оператор CASE проверяет каждую строку, чтобы узнать, истинно ли условное выражение — year = 'SR' .
  2. Для любой данной строки, если это условное выражение истинно, слово «да» печатается в столбце, который мы назвали is_a_senior .
  3. В любой строке, для которой условное выражение ложно, в этой строке ничего не происходит, оставляя нулевое значение в столбце is_a_senior .
  4. В то же время, когда все это происходит, SQL извлекает и отображает все значения в столбцах player_name и year .

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

Но что, если вам не нужны нулевые значения в столбце is_a_senior ? Следующий запрос заменяет эти нули на «нет»:

  ВЫБЕРИТЕ player_name,
       год,
       СЛУЧАЙ, КОГДА год = 'SR' ТОГДА 'да'
            ИНАЧЕ 'нет' КОНЕЦ КАК is_a_senior
  ОТ benn.college_football_players
  

Практическая задача

Напишите запрос, который включает столбец с отметкой «да», если игрок из Калифорнии, и сначала отсортируйте результаты с этими игроками.

Попробуй это
Посмотреть ответ

Добавление нескольких условий в оператор CASE

Вы также можете определить количество результатов в операторе CASE , включив столько операторов WHEN / THEN , сколько вам нужно:

  ВЫБЕРИТЕ player_name,
       масса,
       СЛУЧАЙ, КОГДА вес> 250, ЗАТЕМ "более 250"
            КОГДА вес> 200 ТОГДА '201-250'
            КОГДА вес> 175, ТО "176-200"
            ИНАЧЕ '175 или меньше' КОНЕЦ AS weight_group
  ОТ Бенна.College_football_players
  

В приведенном выше примере операторы WHEN / THEN будут оцениваться в том порядке, в котором они написаны. Таким образом, если значение в столбце веса данной строки равно 300, оно даст результат «более 250». Вот что произойдет, если значение в столбце веса равно 180, SQL сделает следующее:

  1. Убедитесь, что вес больше 250. 180 не больше 250, поэтому переходите к следующему КОГДА / ТО
  2. Проверьте, не превышает ли вес 200.180 не больше 200, поэтому переходите к следующему КОГДА / ТО
  3. Убедитесь, что вес больше 175. 180 на больше 175, поэтому запишите «175-200» в столбце weight_group .

Хотя вышеперечисленное работает, лучше всего создавать операторы, которые не перекрываются. КОГДА вес> 250 и КОГДА вес> 200 перекрываются для каждого значения больше 250, что немного сбивает с толку.Лучше написать это:

  ВЫБЕРИТЕ player_name,
       масса,
       СЛУЧАЙ, КОГДА вес> 250, ЗАТЕМ "более 250"
            КОГДА вес> 200 И вес <= 250, ТО '201-250'
            КОГДА вес> 175 И вес <= 200, ТО '176-200'
            ИНАЧЕ '175 или меньше' КОНЕЦ AS weight_group
  ОТ benn.college_football_players
  

Практическая задача

Напишите запрос, который включает имена игроков и столбец, который классифицирует их по четырем категориям в зависимости от роста.Имейте в виду, что ответ, который мы даем, - это только один из многих возможных ответов, поскольку вы можете разделить рост игроков разными способами.

Попробуй это
Посмотреть ответ

Вы также можете связать несколько условных операторов с AND и OR так же, как и в предложении WHERE :

  ВЫБЕРИТЕ player_name,
       СЛУЧАЙ, КОГДА год = 'FR' И позиция = 'WR' ТОГДА 'frosh_wr'
            ELSE NULL END AS sample_case_statement
  ОТ Бенна.College_football_players
  

Краткий обзор основ CASE:

  1. Оператор CASE всегда входит в предложение SELECT
  2. CASE должен включать следующие компоненты: WHEN , THEN и END . ELSE - дополнительный компонент.
  3. Вы можете сделать любой условный оператор, используя любой условный оператор (например, WHERE ) между WHEN и THEN .Это включает объединение нескольких условных операторов в цепочку с использованием И и ИЛИ .
  4. Вы можете включить несколько операторов WHEN , а также оператор ELSE для обработки любых неадресных условий.

Практическая задача

Напишите запрос, который выбирает все столбцы из benn.college_football_players и добавляет дополнительный столбец, в котором отображается имя игрока, если этот игрок младший или старший.

Попробуй это
Посмотреть ответ

Использование CASE с агрегатными функциями

CASE - немного более сложная и существенно более полезная функциональность, возникающая в результате объединения его с агрегатными функциями. Например, предположим, что вы хотите подсчитать только те строки, которые удовлетворяют определенному условию. Поскольку COUNT игнорирует нули, вы можете использовать оператор CASE для оценки условия и получения нулевых или ненулевых значений в зависимости от результата:

  ВЫБЕРИТЕ СЛУЧАЙ, КОГДА год = 'FR' THEN 'FR'
            ELSE 'Not FR' END AS год_группа,
            COUNT (1) AS count
  ОТ Бенна.College_football_players
 ГРУППИРОВКА ПО ДЕЛУ, КОГДА год = 'FR' THEN 'FR'
               ELSE 'Not FR' END
  

Теперь вы можете подумать: «Почему бы мне просто не использовать предложение WHERE для фильтрации строк, которые я не хочу подсчитывать?» Вы могли бы это сделать - это будет выглядеть так:

  ВЫБРАТЬ СЧЕТ (1) КАК fr_count
  ОТ benn.college_football_players
 ГДЕ год = 'FR'
  

Но что, если вы захотите посчитать еще пару условий? Использование предложения WHERE позволяет подсчитать только одно условие.Вот пример подсчета нескольких условий в одном запросе:

  ВЫБЕРИТЕ СЛУЧАЙ, КОГДА год = 'FR' THEN 'FR'
            КОГДА год = 'ТАК' ТОГДА 'ТАК'
            КОГДА год = 'JR' ТОГДА 'JR'
            КОГДА год = 'SR' ТОГДА 'SR'
            ELSE 'Нет данных за год' END AS year_group,
            COUNT (1) AS count
  ОТ benn.college_football_players
 ГРУППА ПО 1
  

Приведенный выше запрос - отличное место для использования чисел вместо столбцов в предложении GROUP BY , потому что повторение оператора CASE в предложении GROUP BY сделало бы запрос слишком длинным.В качестве альтернативы вы можете использовать псевдоним столбца в предложении GROUP BY следующим образом:

  ВЫБЕРИТЕ СЛУЧАЙ, КОГДА год = 'FR' THEN 'FR'
            КОГДА год = 'ТАК' ТОГДА 'ТАК'
            КОГДА год = 'JR' ТОГДА 'JR'
            КОГДА год = 'SR' ТОГДА 'SR'
            ELSE 'Нет данных за год' END AS year_group,
            COUNT (1) AS count
  ОТ benn.college_football_players
 ГРУППА ПО year_group
  

Обратите внимание, что если вы решите повторить весь оператор CASE , вам следует удалить имя столбца AS year_group при копировании / вставке в предложение GROUP BY :

  ВЫБЕРИТЕ СЛУЧАЙ, КОГДА год = 'FR' THEN 'FR'
            КОГДА год = 'ТАК' ТОГДА 'ТАК'
            КОГДА год = 'JR' ТОГДА 'JR'
            КОГДА год = 'SR' ТОГДА 'SR'
            ELSE 'Нет данных за год' END AS year_group,
            COUNT (1) AS count
  ОТ Бенна.College_football_players
 ГРУППИРОВКА ПО ДЕЛУ, КОГДА год = 'FR' THEN 'FR'
               КОГДА год = 'ТАК' ТОГДА 'ТАК'
               КОГДА год = 'JR' ТОГДА 'JR'
               КОГДА год = 'SR' ТОГДА 'SR'
               ИНАЧЕ «Нет данных за год» КОНЕЦ
  

Поначалу может быть сложно объединить операторы CASE с агрегатами. Часто бывает полезно сначала написать запрос, содержащий оператор CASE , и запустить его самостоятельно. Используя предыдущий пример, вы можете сначала написать:

  ВЫБЕРИТЕ СЛУЧАЙ, КОГДА год = 'FR' THEN 'FR'
            КОГДА год = 'ТАК' ТОГДА 'ТАК'
            КОГДА год = 'JR' ТОГДА 'JR'
            КОГДА год = 'SR' ТОГДА 'SR'
            ELSE 'Нет данных за год' END AS year_group,
            *
  ОТ Бенна.College_football_players
  

Приведенный выше запрос покажет все столбцы в таблице benn.college_football_players , а также столбец, показывающий результаты оператора CASE . Оттуда вы можете заменить * агрегацией и добавить предложение GROUP BY . Попробуйте этот процесс, если вы боретесь с одной из следующих практических проблем.

Практическая задача

Напишите запрос, который подсчитывает количество игроков весом более 300 фунтов для каждого из следующих регионов: Западное побережье (Калифорния, Орегон, Вашингтон), Техас и другие (везде).

Попробуй это
Посмотреть ответ

Практическая задача

Напишите запрос, который вычисляет общий вес всех игроков низшего класса (FR / SO) в Калифорнии, а также общий вес всех игроков высшего класса (JR / SR) в Калифорнии.

Попробуй это
Посмотреть ответ

Использование CASE внутри агрегатных функций

В предыдущих примерах данные отображались вертикально, но в некоторых случаях вы можете захотеть отобразить данные горизонтально.Это называется «поворотным» (как сводная таблица в Excel). Возьмем следующий запрос:

  ВЫБЕРИТЕ СЛУЧАЙ, КОГДА год = 'FR' THEN 'FR'
            КОГДА год = 'ТАК' ТОГДА 'ТАК'
            КОГДА год = 'JR' ТОГДА 'JR'
            КОГДА год = 'SR' ТОГДА 'SR'
            ELSE 'Нет данных за год' END AS year_group,
            COUNT (1) AS count
  ОТ benn.college_football_players
 ГРУППА ПО 1
  

И переориентируйте его по горизонтали:

  ВЫБРАТЬ СЧЕТЧИК (СЛУЧАЙ, КОГДА год = 'FR' ТО 1 ELSE NULL END) КАК fr_count,
       COUNT (CASE WHEN year = 'SO' THEN 1 ELSE NULL END) AS so_count,
       COUNT (CASE WHEN year = 'JR' THEN 1 ELSE NULL END) КАК jr_count,
       COUNT (CASE WHEN year = 'SR' THEN 1 ELSE NULL END) КАК sr_count
  ОТ Бенна.College_football_players
  

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

Отточите свои навыки работы с SQL

Практическая задача

Напишите запрос, который отображает количество игроков в каждом штате, с игроками FR, SO, JR и SR в отдельных столбцах и еще в одном столбце для общего количества игроков.Упорядочивайте результаты так, чтобы на первом месте стояли государства с наибольшим количеством игроков.

Попробуй это
Посмотреть ответ

Практическая задача

Напишите запрос, который показывает количество игроков в школах с именами, начинающимися с A по M, и количество игроков в школах с именами, начинающимися с N - Z.

Попробуй это
Посмотреть ответ

OR не поддерживается оператором CASE в SQL Server

По CASE ответов уже много.Я объясню, когда и как использовать CASE .

Вы можете использовать выражения CASE в любом месте SQL-запросов. Выражения CASE могут использоваться в операторе SELECT, предложениях WHERE, предложениях Order by, предложениях HAVING, Insert, UPDATE и DELETE.

Выражение CASE имеет два следующих формата:

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

      CASE выражение
    КОГДА выражение1 ТО Результат1
    КОГДА выражение2 ТО Результат2
    ИНАЧЕ РезультатN
    КОНЕЦ
      

    Это выражение сравнивает с набором простых выражений, чтобы найти результат.Это выражение сравнивает выражение с выражением в каждом предложении WHEN на предмет эквивалентности. Если выражение в предложении WHEN совпадает, будет возвращено выражение в предложении THEN.

    Вот где падает вопрос ОП. 22978 OR 23218 OR 23219 не получит значение, равное выражению, т.е. ebv.db_no. Вот почему выдает ошибку. Типы данных input_expression и каждое when_expression должны быть одинаковыми или должны быть неявным преобразованием.

  2. Найденные выражения CASE

      КОРПУС
    WHEN Boolean_expression1 THEN Результат1
    КОГДА Boolean_expression2 ТОГДА Результат2
    ИНАЧЕ РезультатN
    КОНЕЦ
      

    Это выражение оценивает набор логических выражений, чтобы найти результат. Это выражение позволяет использовать операторы сравнения и логические операторы И / ИЛИ с в каждом логическом выражении.

1. Оператор SELECT с выражениями CASE

  --Простое выражение CASE:
ВЫБЕРИТЕ FirstName, State = (CASE StateCode
 КОГДА "МП" ТОГДА "Мадхья-Прадеш"
 КОГДА "ВВЕРХ", ТОГДА "Уттар-Прадеш"
 КОГДА "DL" ТОГДА "Дели"
 ELSE NULL
 КОНЕЦ), PayRate
ОТ dbo.Покупатель

- Искомое выражение CASE:
ВЫБЕРИТЕ FirstName, State = (CASE
 КОГДА StateCode = 'MP' ТОГДА 'Мадхья-Прадеш'
 КОГДА StateCode = 'ВВЕРХ' ТОГДА 'Уттар-Прадеш'
 КОГДА StateCode = 'DL' ТОГДА 'Дели'
 ELSE NULL
 КОНЕЦ), PayRate
ОТ dbo.Customer
  

2. Оператор обновления с выражением CASE

  - Простое выражение CASE:
ОБНОВЛЕНИЕ клиента
УСТАНОВИТЬ StateCode = CASE StateCode
 КОГДА "МП" ТОГДА "Мадхья-Прадеш"
 КОГДА "ВВЕРХ", ТОГДА "Уттар-Прадеш"
 КОГДА "DL" ТОГДА "Дели"
 ELSE NULL
 КОНЕЦ

- Простое выражение CASE:
ОБНОВЛЕНИЕ клиента
УСТАНОВИТЬ StateCode = CASE
 КОГДА StateCode = 'MP' ТОГДА 'Мадхья-Прадеш'
 КОГДА StateCode = 'ВВЕРХ' ТОГДА 'Уттар-Прадеш'
 КОГДА StateCode = 'DL' ТОГДА 'Дели'
 ELSE NULL
 КОНЕЦ
  

3.Предложение ORDER BY с выражениями CASE

  - Простое выражение CASE:
ВЫБРАТЬ * ИЗ dbo.Customer
СОРТИРОВАТЬ ПО
 CASE Gender WHEN 'M' THEN FirstName END Desc,
 CASE Пол WHEN 'F' THEN LastName END ASC

- Искомое выражение CASE:
ВЫБРАТЬ * ИЗ dbo.Customer
СОРТИРОВАТЬ ПО
 CASE WHEN Gender = 'M' THEN FirstName END Desc,
 СЛУЧАЙ, КОГДА Gender = 'F' THEN LastName END ASC
  

4. Предложение с выражением CASE

  - Простое выражение CASE:
ВЫБЕРИТЕ FirstName, StateCode, Gender, Total = MAX (PayRate)
ОТ dbo.Покупатель
ГРУППА ПО StateCode, Gender, FirstName
ИМЕЕТ (МАКСИМАЛЬНОЕ (ПРИМЕР Пол, КОГДА 'М'
 ТОГДА PayRate
 ELSE NULL END)> 180.00
 OR MAX (CASE Пол, КОГДА 'F'
 ТОГДА PayRate
 ELSE NULL END)> 170.00)

- Искомое выражение CASE:
ВЫБЕРИТЕ FirstName, StateCode, Gender, Total = MAX (PayRate)
ОТ dbo.Customer
ГРУППА ПО StateCode, Gender, FirstName
ИМЕЕТ (МАКС. (ДИАПАЗОН, КОГДА Пол = 'М'
 ТОГДА PayRate
 ELSE NULL END)> 180.00
 ИЛИ МАКС. (СЛУЧАЙ, КОГДА Пол = 'F'
 ТОГДА PayRate
 ELSE NULL END)> 170.00)
  

Надеюсь, что этот вариант использования поможет кому-то в будущем.

Источник

Заявление

Case в SQL Server (примеры включены)

Хотите применить оператор Case в SQL Server?

Если да, я покажу вам 3 различных способа применения операторов case:

(1) Для одного условия:

 CASE WHEN condition1 THEN result1 ELSE result2 END AS new_field_name
 

(2) Для нескольких условий с использованием AND:

 CASE WHEN condition1 AND condition2 THEN result1 ELSE result2 END AS имя_нового_поля
 

(3) Для нескольких условий и результатов:

 CASE WHEN condition1 THEN result1
     КОГДА условие2 ТО результат2
     КОГДА условие3 ТО результат3
     ...
     КОНЕЦ КАК new_field_name
 

Далее я рассмотрю несколько примеров с шагами по применению операторов case в SQL Server.

Шаги по применению заявлений о случаях в SQL Server

Шаг 1. Создайте таблицу в SQL Server

Если вы еще этого не сделали, создайте таблицу в SQL Server.

Например, я создал таблицу с именем « People », в которой имя базы данных - TestDB.

Вот данные и поля под таблицей «Люди»:

Имя Возраст Член
Джек 28 Нет
Бен 67 Да
Джилл 33 Нет
Мария 72 Да
Билл 17 Нет

Вот как бы выглядела таблица выглядит так в SQL Server:

Вы можете следовать этому руководству, чтобы узнать, как создать таблицу в SQL Server Management Studio.

Шаг 2. Определите правила

Затем определите правила для оператора case.

В нашем примере давайте определим следующие правила:

  • Когда возраст человека равен или превышает 60, , тогда человек имеет право на «скидку для пожилых»
  • В противном случае должно быть ' без скидки '

Шаг 3. Применение оператора Case в SQL Server

Наконец, вы можете использовать следующий шаблон для единственного условия :

 CASE WHEN condition1 THEN result1 ELSE result2 END AS new_field_name
 

В нашем примере:

  • condition1: Age> = 60
  • result1: 'Senior Discount'
  • result2: 'no Discount'
  • new_field_name: Discount

полный синтаксис

Итак будет выглядеть так:

 выбрать
Имя,
Возраст,
СЛУЧАЙ, КОГДА Возраст> = 60 ТОГДА 'скидка для пожилых' ИНАЧЕ 'без скидки' КОНЕЦ скидка
из TestDB.dbo.People
 

Запустите запрос в SQL Server, и вы получите следующий результат:

Дополнительные примеры заявлений о случаях

Пример 1: Несколько условий с использованием AND:

Давайте теперь рассмотрим пример с несколькими условиями, где правила являются:

  • Если возраст человека равен 60 или больше, и человек является участником, , то человек имеет право на «членский подарок»
  • Иначе не должно быть подарок членства '

Вы можете использовать этот шаблон для нескольких условий, используя AND:

 CASE WHEN condition1 AND condition2 THEN result1 ELSE result2 END AS имя_нового_поля
 

Для нашего примера:

  • condition1 AND condition2: Age> = 60 AND Member = 'Yes'
  • result1: 'подарок членства'
  • result2: 'нет подарка членства'
  • new_field_name: подарок

Итак, полный синтаксис для нашего примера будет выглядеть так:

 выбрать
Имя,
Возраст,
Член,
СЛУЧАЙ, КОГДА Возраст> = 60 И Член = 'Да' ТОГДА 'членский подарок' ELSE 'нет членского подарка' КОНЕЦ КАК подарок
из TestDB.dbo.People
 

Запустите запрос, и вы получите следующий результат:

Пример 2: Несколько условий и результатов

В последнем разделе этого руководства давайте рассмотрим пример с несколькими условиями и результатами, где правила:

  • Когда возраст человека равен или старше 60, , затем человек имеет право на «скидку для пожилых»
  • Когда возраст человека равен или старше 18 лет, и меньше 60 лет, тогда должно быть «без скидки»
  • Когда возраст человека меньше 18, , затем человек имеет право на «младшую скидку»

Затем вы можете использовать следующий шаблон для нескольких условий и результатов :

 CASE WHEN condition1 THEN result1
     КОГДА условие2 ТО результат2
     КОГДА условие3 ТО результат3
     ...
     КОНЕЦ КАК new_field_name
 

А вот полный синтаксис для нашего примера:

 выбрать
Имя,
Возраст,
СЛУЧАЙ, КОГДА Возраст> = 60 ЗАТЕМ «скидка для пожилых»
     КОГДА Возраст> = 18 И Возраст <60, ТО "без скидки"
     КОГДА Возраст <18 ТОГДА 'младшая скидка'
     END AS скидка
из TestDB.dbo.People
 

Запустите запрос, и вы получите:

Полное руководство по выражению SQL CASE

Резюме : в этом руководстве вы узнаете, как использовать выражение SQL CASE для добавления логики к операторам SQL. .

Введение в выражение SQL CASE

Выражение SQL CASE позволяет оценить список условий и возвращает один из возможных результатов. Выражение CASE имеет два формата: простой CASE и искомый CASE.

Вы можете использовать выражение CASE в предложении или операторе, допускающем допустимое выражение. Например, вы можете использовать выражение CASE в таких операторах, как SELECT, DELETE и UPDATE, или в предложениях, таких как SELECT, ORDER BY и HAVING.

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

Следующее иллюстрирует простое выражение CASE:

 

Выражение CASE КОГДА when_expression_1 ТО результат_1 КОГДА when_expression_2 ТО результат_2 КОГДА when_expression_3 ТО результат_3 ... ЕЩЕ else_result END

Выражение CASE сравнивает выражение с набором выражений (when_expression_1, when_expression_2, when_expression_3,…) с помощью оператора равенства (=). Если вы хотите использовать другие операторы сравнения, такие как больше (>), меньше (<) и т. Д., Используйте искомое выражение CASE.

Оператор CASE возвращает результат_1, результат_2 или результат_3, если выражение соответствует соответствующему выражению в предложении WHEN.

Если выражение не соответствует ни одному выражению в предложении WHEN, оно возвращает esle_result в предложении ELSE.Предложение ELSE не является обязательным.

Если вы опустите предложение ELSE и выражение не соответствует ни одному выражению в предложении WHEN, выражение CASE вернет NULL.

Простой пример выражения CASE

Давайте взглянем на таблицу сотрудников.

Предположим, что текущий год - 2000.

Мы можем использовать простое выражение CASE, чтобы получить годовщины работы сотрудников, используя следующий оператор:

 

SELECT имя, фамилия, Дата приема на работу, ДЕЛО (2000 - ГОД (аренда_дата)) КОГДА 1 ТО '1 год' КОГДА 3 ТО '3 года' КОГДА 5 ТО '5 лет' КОГДА 10 ТО '10 лет' КОГДА 15 ТО '15 лет ' КОГДА 20 ТОГ 20 лет КОГДА 25 ТОГ '25 лет' КОГДА 30 ТОГ 30 лет КОНЕЦ годовщины ИЗ сотрудники ЗАКАЗАТЬ ПО first_name;

Посмотреть в действии

Функция ГОД возвращает год, когда сотрудник присоединился к компании.Мы получаем количество лет, в течение которых сотрудник работал в компании, и вычитая год, когда сотрудник пришел в компанию, из текущего года (2000).

Мы получаем количество лет, в течение которых сотрудник работал в компании, вычитая год, когда сотрудник присоединился к компании, из текущего года (2000).

Затем мы сравниваем результат с 1, 3, 5, 10, 15, 20, 25, 30. Если год службы равен одному из этих чисел, выражение CASE возвращает годовщину работы сотрудника.

Если год службы сотрудника не совпадает с этими числами, выражение CASE возвращает NULL.

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

Ниже показано искомое выражение CASE.

 

КОРПУС КОГДА логическое_выражение_1 ТО результат_1 КОГДА логическое_выражение_2 ТО результат_2 КОГДА boolean_expression_3 ТО результат_3 ЕЩЕ else_result КОНЕЦ;

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

Если логическое выражение в каждом предложении WHEN истинно, поисковый оператор CASE возвращает результат в соответствующем предложении THEN.

Если логическое выражение не возвращает истину, выражение CASE возвращает результат else_result в предложении ELSE.

Как и простое выражение CASE, предложение END является необязательным. Если вы опускаете предложение ELSE и никакое логическое выражение не оценивается как истинное, выражение CASE возвращает значение NULL.

Пример выражения CASE для поиска

Ниже показан пример выражения CASE для поиска.

 

ВЫБРАТЬ имя, фамилия, ДЕЛО КОГДА зарплата <3000 ТОГДА "Низкая" КОГДА зарплата> = 3000 И зарплата <= 5000, ТО "Средняя" КОГДА зарплата> 5000 ТОГДА "Высокая" КОНЕЦ оценка ИЗ сотрудники;

Посмотреть в действии

Если зарплата меньше 3000, выражение CASE возвращает «Низкий». Если заработная плата составляет от 3000 до 5000, возвращается «средний». Когда зарплата больше 5000, выражение CASE возвращает «High».

В этом руководстве мы познакомили вас с оператором SQL CASE, который позволяет добавлять логику IF THEN ELSE к операторам SQL.

  • Было ли это руководство полезным?
  • Да Нет

Заявление CASE - База знаний MariaDB

Синтаксис

 CASE case_value
    КОГДА when_value THEN список_операторов
    [КОГДА when_value THEN список_операторов] ...
    [ELSE statement_list]
КОНЕЦ ДЕЛА
 

или:

 КОРПУС
    КОГДА search_condition THEN statement_list
    [WHEN search_condition THEN statement_list]...
    [ELSE statement_list]
КОНЕЦ ДЕЛА
 

Описание

Текст на этой странице описывает оператор CASE для сохраненных программ. См. CASE OPERATOR для получения подробной информации об операторе CASE вне сохраненных программ.

Оператор CASE для хранимых программ реализует сложную условную
построить. Если search_condition оценивается как истина, соответствующий SQL
список операторов выполняется. Если ни одно условие поиска не соответствует, список операторов
в ELSE выполняется условие .Каждый список_операторов состоит из одного или
больше заявлений.

Оператор CASE не может содержать предложение ELSE NULL , и это
оканчивается END CASE вместо END . реализует сложную условную
построить. Если search_condition оценивается как истина, соответствующий SQL
список операторов выполняется. Если ни одно условие поиска не соответствует, список операторов
в ELSE выполняется условие . Каждый список_операторов состоит из одного или
больше заявлений.

Если ни одно значение when_value или search_condition не соответствует проверенному значению и CASE
оператор не содержит предложения ELSE , случай не найден для оператора CASE
результаты ошибки.

Каждый список_операторов состоит из одного или нескольких операторов; пустой
список_операторов не допускается. Чтобы справиться с ситуациями, когда нет значения
соответствует любому предложению WHEN , используйте ELSE , содержащий
пустой блок BEGIN ... END, как показано в этом примере:

 DELIMITER |
СОЗДАТЬ ПРОЦЕДУРУ p ()
НАЧИНАТЬ
  ЗАЯВИТЬ v INT ПО УМОЛЧАНИЮ 1;
  ДЕЛО v
    WHEN 2 THEN SELECT v;
    КОГДА 3 ЗАТЕМ ВЫБРАТЬ 0;
    ELSE BEGIN END;
  КОНЕЧНЫЙ ДЕЛО;
КОНЕЦ;
|
 

Отступ, используемый здесь в предложении ELSE , предназначен только для ясности,
и не имеет другого значения.См. Раздел Разделители в клиенте mysql для получения дополнительной информации об использовании команды разделителя.

Примечание: Синтаксис оператора CASE , используемого внутри сохраненных программ
немного отличается от выражения SQL CASE, описанного в
КЕЙС-ОПЕРАТОР.
Оператор CASE не может содержать предложение ELSE NULL , и это
оканчивается END CASE вместо END .

Когда использовать оператор SQL CASE

В этом руководстве мы будем говорить об условной конструкции, называемой оператором SQL CASE . Дополнительное примечание : Если вы хотите прочитать о другой сложной теме SQL, не думайте дважды, прежде чем погрузиться в наше руководство по индексам MySQL.
Итак, MySQL - это богатый язык, и есть много способов выразить условие.
Например, вы можете захотеть получить тип вывода запроса, если определенное условие было выполнено, и другой тип вывода, если оно не было выполнено.

В качестве примера помните, что один из способов применения такой техники - использование функций COALESCE или IFNULL .Однако давайте сосредоточимся на инструкции SQL CASE . Он используется в инструкции SELECT , когда мы хотим вернуть определенное значение на основе некоторого условия.

Синтаксис

Его синтаксис может варьироваться в зависимости от того, что мы хотим показать.

Давайте посмотрим на несколько реальных примеров:
Как мы знаем, в нашей таблице « сотрудников» у нас есть столбец « пол» , заполненный данными типа ENUM . Он содержит значения ‘M’ и ‘F’ .Но что, если вместо этого мы захотим вернуть несколько более значимых значений?
Дополнительное примечание: Если вы не загрузили базу данных «сотрудников», которую мы будем использовать, обязательно загрузите ее здесь.
Итак, вот как может помочь инструкция SQL CASE .

Примеры

В этом примере, когда значение столбца ‘M’ , мы вернем ‘Male’; и если это «F» - «Женский». Так просто.

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

Запуск кода

Посмотрим, что произойдет после того, как мы запустим следующий запрос:

  ВЫБРАТЬ
    emp_no,
    имя,
    фамилия,
    ДЕЛО
        КОГДА пол = 'M' ТОГДА 'Мужской'
        ELSE 'Женский'
    END AS пол
ИЗ
    сотрудники;  

Есть ли другой способ написать оператор SQL CASE?

Если мы напишем следующий код, мы должны получить тот же результат:

  ВЫБРАТЬ
    emp_no,
    имя,
    фамилия,
    CASE пол
        КОГДА "M" ТОГДА "Мужской"
        ELSE 'Женский'
    END AS пол
ИЗ
    сотрудники;  

Как показано на картинке выше, мы добились того, чего хотели.
Это означает, что мы можем получить такой же точный результат, указав имя столбца один раз - сразу после слова CASE . Затем мы должны написать соответствующее значение после ключевого слова WHEN , не используя ’=’.

раз, когда вы не можете его использовать

Однако мы должны сказать, что этот метод работает не во всех случаях. Например, рассмотрим следующий запрос:

  ВЫБРАТЬ
    e.emp_no,
    e.first_name,
    e.last_name,
    ДЕЛО
        КОГДА дм.emp_no НЕ ПУСТЬ ТОГДА "Менеджер"
        ELSE "Сотрудник"
    КОНЕЦ КАК is_manager
ИЗ
    сотрудники е
        ВЛЕВО ПРИСОЕДИНИТЬСЯ
    dept_manager dm ON dm.emp_no = e.emp_no
 КУДА
     e.emp_no> 109990;  

Рассмотрим оператор SQL CASE в этом запросе.

В нем говорится, что если « dm.emp_no » не равно нулю, то SQL вернет значение « Manager» . В противном случае возвращаемое значение будет « Сотрудник» .
И, когда мы запускаем этот запрос, мы получаем именно такой результат, как вы можете видеть на рисунке ниже.

Почему его нельзя использовать?

Теперь в качестве упражнения попробуйте переписать и выполнить тот же запрос, удалив « dm.emp_no » из строки с ключевым словом WHEN и поместив его сразу после CASE . Вот как должен выглядеть код:

  ВЫБРАТЬ
    e.emp_no,
    e.first_name,
    e.last_name,
    ДЕЛО dm.emp_no
        КОГДА НЕ ПУСТО ТО "Менеджер"
        ELSE «Сотрудник»
    КОНЕЦ КАК is_manager
ИЗ
    сотрудники е
        ВЛЕВО ПРИСОЕДИНИТЬСЯ
    dept_manager dm ON dm.emp_no = e.emp_no
КУДА
    e.emp_no> 109990;  

Проблема с IS NULL и NOT NULL

Как показано на рисунке ниже, запрос не вернул правильный результат. Все значения в последнем столбце - « Сотрудник» .

Однако мы хотели получить значение « Менеджер, », если сотрудник одновременно является менеджером. В то же время, используя этот синтаксис, запрос просто возвращает « Сотрудник» .
Это происходит потому, что IS NULL и IS NOT NULL не являются значениями, с которыми можно что-то сравнивать.Итак, правильный способ написания этой конструкции - CASE WHEN , а затем поместить условное выражение, содержащее IS NULL или IS NOT NULL .

Заявление IF

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

Тогда как если это false , возвращаемое значение будет записано на третьем месте.

Выполнение запроса

Итак, давайте запустим следующий запрос:

  ВЫБРАТЬ
    emp_no,
    имя,
    фамилия,
    ЕСЛИ (пол = «М», «Мужской», «Женский») КАК пол
ИЗ
    сотрудники;  

Глядя на изображение выше, мы можем заметить, что этот запрос возвращает тот же результат, что и тот, где мы показали, как получить значения « Male» или « Female» с помощью оператора SQL CASE . И если вы сравните два запроса, вы можете сделать вывод, что они выглядят почти одинаково.Однако оператор IF имеет некоторые ограничения по сравнению с CASE .

IF и CASE

Что ж, с оператором SQL CASE мы можем иметь несколько условных выражений, а с IF мы можем иметь только одно.
Например, давайте посмотрим на следующий запрос:

  ВЫБРАТЬ
    dm.emp_no,
    e.first_name,
    e.last_name,
    MAX (зарплата) - MIN (зарплата) AS salary_difference,
    ДЕЛО
        КОГДА МАКС (с. Зарплата) - МИН (с.зарплата)> 30000 ТОГДА 'Заработная плата увеличена более чем на 30 000 долларов'
        КОГДА МАКС. (Зарплата) - МИН. (Зарплата) МЕЖДУ 20000 И 30000 ТОГДА
                                                                       «Заработная плата увеличена более чем на 20 000 долларов, но менее чем на 30 000 долларов».
        ELSE 'Заработная плата увеличена менее чем на 20 000 долларов'
    КОНЕЦ salary_increase
 ИЗ
    dept_manager dm
        ПРИСОЕДИНИТЬСЯ
    сотрудников е ПО e.emp_no = dm.emp_no
        ПРИСОЕДИНИТЬСЯ
    заработная плата s ON s.emp_no = dm.emp_no
 ГРУППА ПО s.emp_no;  

Как работать с несколькими выражениями WHEN?

Выполняя его, мы можем добиться повышения заработной платы всех руководителей отделов на определенных условиях.Используя несколько выражений WHEN , мы можем вернуть более двух значений в столбце « salary_increase».

Условия

Если у определенного менеджера повышение превышает 30 000 долларов, мы вернем « Заработная плата увеличена более чем на 30 000 долларов» .

Если же вместо этого она составляет от 20 000 до 30 000 долларов, мы хотели бы увидеть «Заработная плата увеличена более чем на 20 000 долларов, но менее чем на 30 000 долларов». Отображается .

Наконец, если ни одно из условий не было выполнено, запрос вернет «Заработная плата увеличена менее чем на 20 000 долларов» .Давайте запустим оператор, чтобы убедиться, что мы сработали правильно.

Итак, это был блестящий пример запроса, вывод которого не может быть получен с помощью простого оператора IF .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *