Синтаксис case sql: Выражение CASE (Transact-SQL) — SQL Server
Условные функции | Документация ClickHouse
- Справка по SQL
- Функции
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
description | title | ms.date | ms.prod | ms.technology | ms.custom | ms.topic | ms.author | ms.reviewer | author | ms.openlocfilehash | ms.sourcegitcommit | ms.translationtype | ms.contentlocale | ms.lasthandoff | ms.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
Проще говоря, вот что происходит:
- Оператор
CASE
проверяет каждую строку, чтобы узнать, истинно ли условное выражение —year = 'SR'
. - Для любой данной строки, если это условное выражение истинно, слово «да» печатается в столбце, который мы назвали
is_a_senior
. - В любой строке, для которой условное выражение ложно, в этой строке ничего не происходит, оставляя нулевое значение в столбце
is_a_senior
. - В то же время, когда все это происходит, 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 сделает следующее:
- Убедитесь, что вес
КОГДА
/ТО
- Проверьте, не превышает ли вес
КОГДА
/ТО
- Убедитесь, что вес
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:
- Оператор
CASE
всегда входит в предложениеSELECT
-
CASE
должен включать следующие компоненты:WHEN
,THEN
иEND
.ELSE
- дополнительный компонент. - Вы можете сделать любой условный оператор, используя любой условный оператор (например,
WHERE
) междуWHEN
иTHEN
.Это включает объединение нескольких условных операторов в цепочку с использованиемИ
иИЛИ
. - Вы можете включить несколько операторов
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 имеет два следующих формата:
Простое выражение CASE
CASE выражение КОГДА выражение1 ТО Результат1 КОГДА выражение2 ТО Результат2 ИНАЧЕ РезультатN КОНЕЦ
Это выражение сравнивает с набором простых выражений, чтобы найти результат.Это выражение сравнивает выражение с выражением в каждом предложении WHEN на предмет эквивалентности. Если выражение в предложении WHEN совпадает, будет возвращено выражение в предложении THEN.
Вот где падает вопрос ОП.
22978 OR 23218 OR 23219
не получит значение, равное выражению, т.е. ebv.db_no. Вот почему выдает ошибку. Типы данных input_expression и каждое when_expression должны быть одинаковыми или должны быть неявным преобразованием.Найденные выражения 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 .