Простые команды CASE
Простая команда CASE позволяет выбрать для выполнения одну из нескольких последовательностей команд PL/SQL в зависимости от результата вычисления выражения. Он записывается следующим образом:
CASE выражениеWHEN результат_1 THENкоманды_1WHEN результат_2 THENкоманды_2…ELSEкоманды_elseEND CASE;
Ветвь ELSE здесь не обязательна. При выполнении такой команды PL/SQL сначала вычисляет выражение, после чего результат сравнивается с результат_1. Если они совпадают, то выполняются команды_1. В противном случае проверяется значение результат_2 и т. д.
Приведем пример простой команды CASE, в котором премия начисляется в зависимости от значения переменной employee_type:
CASE employee_typeWHEN ‘S’ THENaward_salary_bonus(employee_id);WHEN ‘H’ THENaward_hourly_bonus(employee_id);WHEN ‘C’ THENaward_commissioned_bonus(employee_id);ELSERAISE invalid_employee_type;END CASE;
В этом примере присутствует явно заданная секция ELSE, однако в общем случае она не обязательна. Без секции ELSE компилятор PL/SQL неявно подставляет такой код:
ELSERAISE CASE_NOT_FOUND;
Иначе говоря, если не задать ключевое слово ELSE и если никакой из результатов в секциях WHEN не соответствует результату выражения в команде CASE, PL/SQL инициирует исключение CASE_NOT_FOUND. В этом и заключается отличие данной команды от IF. Когда в команде IF отсутствует ключевое слово ELSE, то при невыполнении условия не происходит ничего, тогда как в команде CASE аналогичная ситуация приводит к ошибке.
Интересно посмотреть, как с помощью простой команды CASE реализовать описанную в начале главы логику начисления премий. На первый взгляд это кажется невозможным, но подойдя к делу творчески, мы приходим к следующему решению:
CASE TRUEWHEN salary >= 10000 AND salary <=20000THENgive_bonus(employee_id, 1500);WHEN salary > 20000 AND salary <= 40000THENgive_bonus(employee_id, 1000);WHEN salary > 40000THENgive_bonus(employee_id, 500);ELSEgive_bonus(employee_id, 0);END CASE;
Здесь важно то, что элементы выражение и результат могут быть либо скалярными значениями, либо выражениями, результатами которых являются скалярные значения. Вернувшись к команде IF…THEN…ELSIF, реализующей ту же логику, вы увидите, что в команде CASE определена секция ELSE, тогда как в команде IF–THEN–ELSIF ключевое слово ELSE отсутствует
Причина добавления ELSE проста: если ни одно из условий начисления премии не выполняется, команда IF ничего не делает, и премия получается нулевой. Команда CASE в этом случае выдает ошибку, поэтому ситуацию с нулевым размером премии приходится программировать явно
Вернувшись к команде IF…THEN…ELSIF, реализующей ту же логику, вы увидите, что в команде CASE определена секция ELSE, тогда как в команде IF–THEN–ELSIF ключевое слово ELSE отсутствует. Причина добавления ELSE проста: если ни одно из условий начисления премии не выполняется, команда IF ничего не делает, и премия получается нулевой. Команда CASE в этом случае выдает ошибку, поэтому ситуацию с нулевым размером премии приходится программировать явно.
Чтобы предотвратить ошибки CASE_NOT_FOUND, убедитесь в том, что при любом значении проверяемого выражения будет выполнено хотя бы одно из условий.
Приведенная выше команда CASE TRUE кому-то покажется эффектным трюком, но на самом деле она всего лишь реализует поисковую команду CASE, о которой мы поговорим в следующем разделе.
CASE в Transact-SQL
CASE – это инструкция, которая проверяет список условий и возвращает соответствующий результат. Если говорить в целом о программировании, то CASE – это что-то вроде многократного использования конструкции IF-ELSE, во многих языках есть похожая конструкция SWITCH, так вот CASE, как я уже отметил, делает примерно то же самое.
Выражение CASE можно использовать практически в любой инструкции T-SQL, где есть возможность использовать допустимые выражения, например: SELECT, UPDATE, WHERE, SET и даже в ORDER BY.
CASE имеет два так называемых формата:
- Простое выражение CASE – это простое сравнение значения (выражения) с набором других значений (выражений);
- Поисковое выражение CASE – в данном случае CASE содержит набор логических выражений, которые вычисляются, чтобы вернуть результат.
Синтаксис CASE в Transact-SQL
Простое выражение CASE
CASE input_expression WHEN when_expression THEN result_expression END
Поисковое выражение CASE
CASE WHEN Boolean_expression THEN result_expression END
Описание параметров:
- input_expression — выражение, которое необходимо проверить в простом формате CASE;
- WHEN when_expression — выражение, с которым сравнивается input_expression, в случае с простым форматом. Тип данных when_expression должен быть такой же, как и у input_expression, или хотя бы неявно преобразовываться;
- THEN result_expression — выражение, которое будет возвращено, если текущее условие выполняется;
- ELSE else_result_expression – дополнительный параметр ELSE, который предназначен для случаев, когда ни одно из перечисленных в CASE условий не выполнилось. Это необязательный параметр. Если ELSE не указано, а условия не выполнились, вернётся NULL;
- WHEN Boolean_expression — логическое выражение, используемое в поисковом формате CASE, которое служит для вычисления результата. Это своего рода проверочное условие и таких условий может быть несколько.
CASE возвращает результат первого выражения (THEN result_expression), условие которого выполнилось, т.е. WHEN возвращает TRUE. Таким образом, если CASE содержит несколько эквивалентных условий WHEN, которые будут возвращать TRUE, вернется результат (указанный в THEN) первого выражения.
Тип данных возвращаемого результата выражением CASE, будет соответствовать наиболее приоритетному типу данных из набора типов в выражениях result_expressions и else_result_expression.
Arguments
input_expression Is the expression evaluated when the simple CASE format is used. input_expression is any valid expression.
WHEN when_expression Is a simple expression to which input_expression is compared when the simple CASE format is used. when_expression is any valid expression. The data types of input_expression and each when_expression must be the same or must be an implicit conversion.
THEN result_expression Is the expression returned when input_expression equals when_expression evaluates to TRUE, or Boolean_expression evaluates to TRUE. result expression is any valid expression.
ELSE else_result_expression Is the expression returned if no comparison operation evaluates to TRUE. If this argument is omitted and no comparison operation evaluates to TRUE, CASE returns NULL. else_result_expression is any valid expression. The data types of else_result_expression and any result_expression must be the same or must be an implicit conversion.
WHEN Boolean_expression Is the Boolean expression evaluated when using the searched CASE format. Boolean_expression is any valid Boolean expression.
To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.
SQL Fiddle DEMO
Kent Pawar
1,42822 gold badges1717 silver badges3333 bronze badges
answered Sep 29 ’12 at 7:46
Adriaan StanderAdriaan Stander
149k2626 gold badges267267 silver badges275275 bronze badges
2
You can rewrite it to use the ELSE condition of a CASE:
SELECT status, CASE status WHEN ‘i’ THEN ‘Inactive’ WHEN ‘t’ THEN ‘Terminated’ ELSE ‘Active’ END AS StatusTextFROM stage.tst
answered Sep 29 ’12 at 7:42
Sathyajith BhatSathyajith Bhat
19.6k2121 gold badges8989 silver badges125125 bronze badges
Of course…
select case substr(status,1,1) — you’re only interested in the first character. when ‘a’ then ‘Active’ when ‘i’ then ‘Inactive’ when ‘t’ then ‘Terminated’ end as statustext from stage.tst
However, there’s a few worrying things about this schema. Firstly if you have a column that means something, appending a number onto the end it not necessarily the best way to go. Also, depending on the number of status’ you have you might want to consider turning this column into a foreign key to a separate table.
Based on your comment you definitely want to turn this into a foreign key. For instance
create table statuses ( — Not a good table name status varchar2(10) , description varchar2(10) , constraint pk_statuses primary key (status) )create table tst ( id number , status varchar2(10) , constraint pk_tst primary key (id) , constraint fk_tst foreign key (status) references statuses (status) )
Your query then becomes
select a.status, b.description from tst a left outer join statuses b on a.status = b.status
Here’s a SQL Fiddle to demonstrate.
answered Sep 29 ’12 at 7:43
BenBen
47.8k3030 gold badges114114 silver badges130130 bronze badges
2
It will be easier to do using decode.
SELECT status, decode ( status, ‘a1′,’Active’, ‘a2′,’Active’, ‘a3′,’Active’, ‘i’,’Inactive’, ‘t’,’Terminated’, ‘Default’)STATUSTEXTFROM STATUS
answered Oct 6 ’17 at 9:45
ThunderThunder
9,0672424 gold badges7474 silver badges111111 bronze badges
Since web search for Oracle case tops to that link, I add here for case statement, though not answer to the question asked about case expression:
CASE WHEN grade = ‘A’ THEN dbms_output.put_line(‘Excellent’); WHEN grade = ‘B’ THEN dbms_output.put_line(‘Very Good’); WHEN grade = ‘C’ THEN dbms_output.put_line(‘Good’); WHEN grade = ‘D’ THEN dbms_output.put_line(‘Fair’); WHEN grade = ‘F’ THEN dbms_output.put_line(‘Poor’); ELSE dbms_output.put_line(‘No such grade’);END CASE;
or other variant:
CASE grade WHEN ‘A’ THEN dbms_output.put_line(‘Excellent’); WHEN ‘B’ THEN dbms_output.put_line(‘Very Good’); WHEN ‘C’ THEN dbms_output.put_line(‘Good’); WHEN ‘D’ THEN dbms_output.put_line(‘Fair’); WHEN ‘F’ THEN dbms_output.put_line(‘Poor’); ELSE dbms_output.put_line(‘No such grade’);END CASE;
Per Oracle docs: https://docs.oracle.com/cd/B10501_01/appdev.920/a96624/04_struc.htm
answered Jun 17 ’19 at 12:26
Alexei MartianovAlexei Martianov
2,14133 gold badges2020 silver badges4848 bronze badges
1
SELECT STATUS, CASE WHEN STATUS IN(‘a1′,’a2′,’a3’) THEN ‘Active’ WHEN STATUS = ‘i’ THEN ‘Inactive’ WHEN STATUS = ‘t’ THEN ‘Terminated’ ELSE null END AS STATUSTEXTFROM stage.tst;
jean
3,84244 gold badges2828 silver badges4545 bronze badges
answered Nov 16 ’17 at 9:43
1
You can only check the first character of the status. For this you use substring function.
substr(status, 1,1)
In your case past.
answered Sep 29 ’12 at 7:52
Timo HahnTimo Hahn
2,06622 gold badges1515 silver badges1414 bronze badges
Following syntax would work :
….where x.p_NBR =to_number(substr(y.k_str,11,5))and x.q_nbr = (case when instr(substr(y.m_str,11,9),’_’) = 6 then to_number(substr(y.m_str,11,5)) when instr(substr(y.m_str,11,9),’_’) = 0 then to_number(substr(y.m_str,11,9)) else 1 end)
Noel
8,3652828 gold badges3939 silver badges6262 bronze badges
answered Nov 8 ’13 at 14:29
Smart CoderSmart Coder
78177 silver badges1313 bronze badges
CASE TO_CHAR(META.RHCONTRATOSFOLHA.CONTRATO)WHEN ’91’ AND TO_CHAR(META.RHCONTRATOSFOLHA.UNIDADE) = ‘0001’ THEN ’91RJ’WHEN ’91’ AND TO_CHAR(META.RHCONTRATOSFOLHA.UNIDADE) = ‘0002’ THEN ’91SP’END CONTRATO,00905. 00000 – “missing keyword”*Cause: *Action:Erro na linha: 15 Coluna: 11
answered Jan 26 ’19 at 13:24
VitorVitor
111 bronze badge
1
DECODE(SUBSTR(STATUS,1,1),’a’,’Active’,’i’,’Inactive’,’t’,’Terminated’,’N/A’)
answered Feb 18 at 11:38
sbrbotsbrbot
5,00733 gold badges3030 silver badges6161 bronze badges
Предварительная подготовка
Рекомендуемая подготовка (необязательная): Успешное окончание курса Microsoft Excel 2019/2016. Уровень 3. Анализ и визуализация данных или эквивалентная подготовка.
Получить консультацию о необходимой предварительной подготовке по курсу Вы можете у наших менеджеров: +7 (495) 232-32-16.
Наличие предварительной подготовки является залогом Вашего успешного обучения. Предварительная подготовка указывается в виде названия других курсов Центра (Обязательная предварительная подготовка). Вам следует прочитать программу указанного курса и самостоятельно оценить, есть ли у Вас знания и опыт, эквивалентные данной программе. Если Вы обладаете знаниями менее 85-90% рекомендуемого курса, то Вы обязательно должны получить предварительную подготовку. Только после этого Вы сможете качественно обучиться на выбранном курсе.
Операторы работы с наборами
Кроме операторов, рассмотренных ранее, язык Transact-SQL поддерживает еще три оператора работы с наборами: UNION, INTERSECT и EXCEPT.
Оператор UNION
Оператор UNION объединяет результаты двух или более запросов в один результирующий набор, в который входят все строки, принадлежащие всем запросам в объединении. Соответственно, результатом объединения двух таблиц является новая таблица, содержащая все строки, входящие в одну из исходных таблиц или в обе эти таблицы.
Общая форма оператора UNION выглядит таким образом:
Параметры select_1, select_2, … представляют собой инструкции SELECT, которые создают объединение. Если используется параметр ALL, отображаются все строки, включая дубликаты. В операторе UNION параметр ALL имеет то же самое значение, что и в списке выбора SELECT, но с одним отличием: для списка выбора SELECT этот параметр применяется по умолчанию, а для оператора UNION его нужно указывать явно.
В своей исходной форме база данных SampleDb не подходит для демонстрации применения оператора UNION. Поэтому в этом разделе создается новая таблица EmployeeEnh, которая идентична существующей таблице Employee, но имеет дополнительный столбец City. В этом столбце указывается место жительства сотрудников.
Создание таблицы EmployeeEnh предоставляет нам удобный случай продемонстрировать использование предложения INTO в инструкции SELECT. Инструкция SELECT INTO выполняет две операции. Сначала создается новая таблица со столбцами, перечисленными в списке выбора SELECT. Потом строки исходной таблицы вставляются в новую таблицу. Имя новой таблицы указывается в предложении INTO, а имя таблицы-источника указывается в предложении FROM.
В примере ниже показано создание таблицы EmployeeEnh из таблицы Employee:
В этом примере инструкция SELECT INTO создает таблицу EmployeeEnh, вставляет в нее все строки из таблицы-источника Employee, после чего инструкция ALTER TABLE добавляет в новую таблицу столбец City. Но добавленный столбец City не содержит никаких значений. Значения в этот столбец можно вставить посредством среды Management Studio или же с помощью следующего кода:
Теперь мы готовы продемонстрировать использование инструкции UNION. В примере ниже показан запрос для создания соединения таблиц EmployeeEnh и Department, используя эту инструкцию:
Результат выполнения этого запроса:
Объединять с помощью инструкции UNION можно только совместимые таблицы. Под совместимыми таблицами имеется в виду, что оба списка столбцов выборки должны содержать одинаковое число столбцов, а соответствующие столбцы должны иметь совместимые типы данных. (В отношении совместимости типы данных INT и SMALLINT не являются совместимыми.)
Результат объединения можно упорядочить, только используя предложение ORDER BY в последней инструкции SELECT, как это показано в примере ниже. Предложения GROUP BY и HAVING можно применять с отдельными инструкциями SELECT, но не в самом объединении.
Запрос в этом примере осуществляет выборку сотрудников, которые или работают в отделе d1, или начали работать над проектом до 1 января 2008 г.
Оператор UNION поддерживает параметр ALL. При использовании этого параметра дубликаты не удаляются из результирующего набора.
Вместо оператора UNION можно применить оператор OR, если все инструкции SELECT, соединенные одним или несколькими операторами UNION, ссылаются на одну и ту же таблицу. В таком случае набор инструкций SELECT заменяется одной инструкцией SELECT с набором операторов OR.
Операторы INTERSECT и EXCEPT
Два других оператора для работы с наборами, INTERSECT и EXCEPT, определяют пересечение и разность соответственно. Под пересечением в данном контексте имеется набор строк, которые принадлежат к обеим таблицам. А разность двух таблиц определяется как все значения, которые принадлежат к первой таблице и не присутствуют во второй. В примере ниже показано использование оператора INTERSECT:
Язык Transact-SQL не поддерживает использование параметра ALL ни с оператором INTERSECT, ни с оператором EXCEPT. Использование оператора EXCEPT показано в примере ниже:
Следует помнить, что эти три оператора над множествами имеют разный приоритет выполнения: оператор INTERSECT имеет наивысший приоритет, за ним следует оператор EXCEPT, а оператор UNION имеет самый низкий приоритет. Невнимательность к приоритету выполнения при использовании нескольких разных операторов для работы с наборами может повлечь неожиданные результаты.
Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)
Ж. Использование инструкции SELECT с выражением CASE
В инструкции SELECT выражение позволяет заменять значения в результирующем наборе на основе значений сравнения. В следующем примере выражение используется для изменения способа отображения категорий линейки продуктов с целью сделать их более понятными. Если значение не существует, отображается текст «Не продается».
H. Использование CASE в инструкции UPDATE
В следующем примере выражение в инструкции UPDATE используется для определения значения, заданного для столбца для сотрудников с значением 0. Если при вычитании 10 часов из получается отрицательное значение, увеличивается на 40 часов. В противном случае значение увеличивается на 20 часов.
Parameters of the CASE Statement
The parameters or components of the CASE SQL statement are:
- expression (optional): This is the expression that the CASE statement looks for. If we’re comparing this to an IF statement, this is the check done inside the IF statement (e.g. for IF x > 10, the expression would be “x > 10”
- condtion_1/condition_n (mandatory): These values are a result of the expression parameter mentioned. They are the possible values that expression can evaluate to. Alternatively, they can be an expression on their own, as there are two ways to write an SQL CASE statement (as explained below). They also relate to the IF statement in the IF-THEN-ELSE structure.
- result_1/result_n (mandatory): These values are the value to display if the related condition is matched. They come after the THEN keyword and relate to the THEN part of the IF-THEN-ELSE structure.
- result (optional): This is the value to display if none of the conditions in the CASE statement are true. It is the ELSE part of the IF-THEN-ELSE structure and is not required for the CASE SQL statement to work.
- case_name (optional): This value indicates what the column should be referred to as when displayed on the screen or from within a subquery. It’s also called the column alias.
CASE WHEN Issues
Query Time
Time to complete a query can be a problem. There is no defined maximum for the number of WHEN conditions you can have within a CASE WHEN statement. CASE WHEN queries can become very slow because the query has to check each condition for every row until it finds a case where it satisfies the condition. This can dramatically increase the query time.
If queries are taking a long time to finish, consider finding ways to optimize your query. More on optimizing queries from Data School here.
Data Types
Make sure that you are comparing the correct data types in your queries. If you try to compare incompatible types SQL will return an “Invalid Input Syntax” error.
The Name field is a VARCHAR and we compare it to the characters “40”.
Different Data Type
The Name field is a VARCHAR and cannot be compared to an INTEGER.
Remember you can cast any of your values in order to make the data types match. More on casting from intersystems here. To determine what data type is used in a column you can use the “\d (Table name)” command and look for the “Type” column:
PHP и MySQL
Еще раз хочу подчеркнуть, что запросы при создании интернет-проекта — это обычное дело. Чтобы их использовать в php-документах выполните такой алгоритм действий:
- Соединяемся с БД при помощи команды mysql_connect();
- Используя mysql_select_db() выбираем нужную БД;
- Обрабатываем запрос при помощи mysql_fetch_array();
- Закрываем соединение командой mysql_close().
Важно! Работать с БД не сложно. Главное — правильно написать запрос
Начинающие вебмастера подумают. А что почитать по этой теме? Хотелось бы порекомендовать книгу Мартина Грабера « SQL для простых смертных ». Она написана так, что новичкам все будет понятно. Используйте ее в качестве настольной книги.
Но это теория. Как же обстоит дело на практике? В действительности интернет-проект нужно не только создать, но еще и вывести в ТОП Гугла и Яндекса. В этом вас поможет видеокурс « Создание и раскрутка сайта ».
CASE with NULL Values
When using , you may notice unwanted NULL values in your result set. Why do these values appear and what actions can you take to remove them? NULL values appear when a value does not match any of the or statements you declare. Let’s look at a practical example that shows how NULL can be returned.
Imagine that we excluded the statement from our previous example. How would it impact our results? Let’s look at the previous query, this time without the statement:
SELECT Item, CASE WHEN Quantity > 0 AND Quantity 20 AND Quantity 50 THEN 'High' END AS 'Stock Level' FROM stock
The results would look like this. Pay special attention to the Stock Level for sugar:
Item | Stock Level |
---|---|
Bread | Medium |
Milk | Low |
Coffee | High |
Sugar | NULL |
Eggs | High |
Apples | Low |
Without to handle the situation of being zero, our query returns a NULL.
If you have an unwanted NULL value in your results, you may have a scenario that is not covered by your and conditions.
См. также:
Выражения (Transact-SQL)
SELECT (Transact-SQL)
COALESCE (Transact-SQL)
IIF (Transact-SQL)
CHOOSE (Transact-SQL)
Источник
В этом учебном пособии вы узнаете, как использовать оператор CASE в SQL Server (Transact-SQL) с синтаксисом и примерами.
Описание
В SQL Server (Transact-SQL) оператор CASE имеет функциональные возможности оператора IF-THEN-ELSE. Вы можете использовать оператор CASE в SQL-предложении.
Синтаксис
Синтаксис оператора CASE в SQL Server (Transact-SQL):
CASE expression
WHEN value_1 THEN result_1
WHEN value_2 THEN result_2
…
WHEN value_n THEN result_n
ELSE result
END
ИЛИ
CASE
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
…
WHEN condition_n THEN result_n
ELSE result
END
Параметры или аргументы
expression – выражение, которое будет сравниваться с каждым из предоставленных значений. (то есть: value_1, value_2, … value_n).
value_1, value_2, … value_n – значения, которые будут сравниваться. Значения сравниваются в указанном порядке. Когда value соответствует expression, оператор CASE выполнит указанные команды и не будет дальше сравнивать value.
condition_1, condition_2, … condition_n – условия, которые будут сравниваться. Условия сравниваются в указанном порядке. Как только условие окажется истинным, оператор CASE вернет результат и не будет сравнивать условия дальше. Все условия должны быть одного и того же типа.
result_1, result_2, … result_n – возвращаемые значение после того, как условие установлено как true. Все значения должны быть одного типа данных.
Примечание
- Если value/condition не определено как TRUE, оператор CASE вернет значение в операторе ELSE.
- Если ELSE опущено, и ни одно условие не является истинным, то оператор CASE вернет NULL.
- Условия сравниваются в указанном порядке. Как только условие окажется истинным, оператор CASE вернет результат и не будет сравнивать условия дальше.
- Вы не можете использовать оператор CASE для управления потоком программы, вместо этого используйте циклы и условные операторы.
Применение
Оператор CASE может использоваться в следующих версиях SQL Server (Transact-SQL):
SQL Server vNext, SQL Server 2016, SQL Server 2015, SQL Server 2014, SQL Server 2012, SQL Server 2008 R2, SQL Server 2008, SQL Server 2005
Пример
Рассмотрим некоторые примеры SQL Server оператора CASE, чтобы понять, как использовать оператор CASE в SQL Server (Transact-SQL). Например:
SELECT shop_id, CASE market_id WHEN 1 THEN ‘IKEA’ WHEN 2 THEN ‘METRO’ ELSE ‘EMAG’ END FROM markets; |
Или вы можете написать SQL-предложение с помощью оператора CASE следующим образом: (исключая выражение)
SELECT shop_id, CASE WHEN market_id = 1 THEN ‘IKEA’ WHEN market_id = 2 THEN ‘METRO’ ELSE ‘EMAG’ END FROM markets; |
Следует отметить, что условие ELSE в операторе CASE является необязательным. Его можно было бы опустить. Давайте изменим наши примеры, если условие ELSE опущено.
Ваш оператор SQL будет выглядеть следующим образом:
SELECT shop_id, CASE market_id WHEN 1 THEN ‘IKEA’ WHEN 2 THEN ‘METRO’ END FROM markets; |
ИЛИ
SELECT shop_id, CASE WHEN market_id = 1 THEN ‘IKEA’ WHEN market_id = 2 THEN ‘METRO’ END FROM markets; |
Если опущено ELSE, и если условие не было определено как true, оператор CASE возвращает NULL.
Сравнение двух условий
Вот пример, демонстрирующий, как использовать оператор CASE для сравнения различных условий:
SELECT CASE WHEN market_id < 100 THEN ‘IKEA’ WHEN shop_id = 2 THEN ‘METRO’ END FROM s; |
Просто помните, что условия сравниваются в указанном порядке. Как только условие окажется истинным, оператор CASE вернет результат и не будет сравнивать условия дальше. Поэтому будьте осторожны при выборе порядка, в котором перечислены ваши условия.
Источник
Простое выражение CASE
Синтаксис простого выражения CASE следующий:
Сравнение простых выражений CASEВыражение после иЗначение выражения в списке, найдите первое совпадающее значение (=) и верните соответствующий результат; если подходящего значения нет, вернитеЗначение предложения; если не указано в данный моментПредложение возвращает нулевое значение.
например:
Вышеупомянутый запрос показывает соответствующее название должности согласно разным номерам должностей, гдеУбедитесь, что значение NULL не возвращается.
Простое выражение CASE просто сравнивает, равны ли два значения, а затем возвращает соответствующее значение. Если мы хотим судить на основе более сложных условий, например, является ли значение пустым, больше ли значение заданного значения, или даже использовать результат подзапроса, чтобы судить, нам нужно использовать более мощное выражение поиска CASE.
Синтаксис
WHEN condition_1 THEN result_1 WHEN condition_2 THEN result_2 … WHEN condition_n THEN result_n
Параметры или аргументы
expression не является обязательным. Это значение, которое вы сравниваете с условиями (то есть: condition_1 , condition_2 … condition_n ).
condition_1 .. condition_n должны быть одного типа. Условия оцениваются по порядку, одно за другим. После того, как условие примет значение TRUE (истина), оператор CASE вернет результат, и не будет оценивать условия дальше.
result_1 .. result_n все должны быть одного типа данных. Это значение возвращается единожды, когда условие примет TRUE (истина).
Примечание
- Если условие не примет TRUE, то оператор CASE вернет значение предложения ELSE.
- Если предложение ELSE опущено и условие не примет TRUE, то оператор CASE вернет NULL.
- Оператор CASE может иметь до 255 сравнений. Каждое предложение WHEN … THEN рассматривает 2 сравнения.
Синтаксис
Синтаксис оператора CASE в SQL Server (Transact-SQL):
CASE expression
WHEN value_1 THEN result_1
WHEN value_2 THEN result_2
…
WHEN value_n THEN result_n
ELSE result
END
ИЛИ
CASE
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
…
WHEN condition_n THEN result_n
ELSE result
END
Параметры или аргументы
expression — выражение, которое будет сравниваться с каждым из предоставленных значений. (то есть: value_1, value_2, … value_n).value_1, value_2, … value_n — значения, которые будут сравниваться. Значения сравниваются в указанном порядке. Когда value соответствует expression, оператор CASE выполнит указанные команды и не будет дальше сравнивать value.condition_1, condition_2, … condition_n — условия, которые будут сравниваться. Условия сравниваются в указанном порядке. Как только условие окажется истинным, оператор CASE вернет результат и не будет сравнивать условия дальше. Все условия должны быть одного и того же типа.result_1, result_2, … result_n – возвращаемые значение после того, как условие установлено как true. Все значения должны быть одного типа данных.
SQL Fiddle DEMO
Kent Pawar
1,42822 gold badges1717 silver badges3333 bronze badges
answered Sep 29 ’12 at 7:46
Adriaan StanderAdriaan Stander
149k2626 gold badges267267 silver badges275275 bronze badges
2
You can rewrite it to use the ELSE condition of a CASE:
SELECT status, CASE status WHEN ‘i’ THEN ‘Inactive’ WHEN ‘t’ THEN ‘Terminated’ ELSE ‘Active’ END AS StatusTextFROM stage.tst
answered Sep 29 ’12 at 7:42
Sathyajith BhatSathyajith Bhat
19.6k2121 gold badges8989 silver badges125125 bronze badges
Of course…
select case substr(status,1,1) — you’re only interested in the first character. when ‘a’ then ‘Active’ when ‘i’ then ‘Inactive’ when ‘t’ then ‘Terminated’ end as statustext from stage.tst
However, there’s a few worrying things about this schema. Firstly if you have a column that means something, appending a number onto the end it not necessarily the best way to go. Also, depending on the number of status’ you have you might want to consider turning this column into a foreign key to a separate table.
Based on your comment you definitely want to turn this into a foreign key. For instance
create table statuses ( — Not a good table name status varchar2(10) , description varchar2(10) , constraint pk_statuses primary key (status) )create table tst ( id number , status varchar2(10) , constraint pk_tst primary key (id) , constraint fk_tst foreign key (status) references statuses (status) )
Your query then becomes
select a.status, b.description from tst a left outer join statuses b on a.status = b.status
Here’s a SQL Fiddle to demonstrate.
answered Sep 29 ’12 at 7:43
BenBen
47.8k3030 gold badges114114 silver badges130130 bronze badges
2
It will be easier to do using decode.
SELECT status, decode ( status, ‘a1′,’Active’, ‘a2′,’Active’, ‘a3′,’Active’, ‘i’,’Inactive’, ‘t’,’Terminated’, ‘Default’)STATUSTEXTFROM STATUS
answered Oct 6 ’17 at 9:45
ThunderThunder
9,0672424 gold badges7474 silver badges111111 bronze badges
Since web search for Oracle case tops to that link, I add here for case statement, though not answer to the question asked about case expression:
CASE WHEN grade = ‘A’ THEN dbms_output.put_line(‘Excellent’); WHEN grade = ‘B’ THEN dbms_output.put_line(‘Very Good’); WHEN grade = ‘C’ THEN dbms_output.put_line(‘Good’); WHEN grade = ‘D’ THEN dbms_output.put_line(‘Fair’); WHEN grade = ‘F’ THEN dbms_output.put_line(‘Poor’); ELSE dbms_output.put_line(‘No such grade’);END CASE;
or other variant:
CASE grade WHEN ‘A’ THEN dbms_output.put_line(‘Excellent’); WHEN ‘B’ THEN dbms_output.put_line(‘Very Good’); WHEN ‘C’ THEN dbms_output.put_line(‘Good’); WHEN ‘D’ THEN dbms_output.put_line(‘Fair’); WHEN ‘F’ THEN dbms_output.put_line(‘Poor’); ELSE dbms_output.put_line(‘No such grade’);END CASE;
Per Oracle docs: https://docs.oracle.com/cd/B10501_01/appdev.920/a96624/04_struc.htm
answered Jun 17 ’19 at 12:26
Alexei MartianovAlexei Martianov
2,14133 gold badges2020 silver badges4848 bronze badges
1
SELECT STATUS, CASE WHEN STATUS IN(‘a1′,’a2′,’a3’) THEN ‘Active’ WHEN STATUS = ‘i’ THEN ‘Inactive’ WHEN STATUS = ‘t’ THEN ‘Terminated’ ELSE null END AS STATUSTEXTFROM stage.tst;
jean
3,84244 gold badges2828 silver badges4545 bronze badges
answered Nov 16 ’17 at 9:43
1
You can only check the first character of the status. For this you use substring function.
substr(status, 1,1)
In your case past.
answered Sep 29 ’12 at 7:52
Timo HahnTimo Hahn
2,06622 gold badges1515 silver badges1414 bronze badges
Following syntax would work :
….where x.p_NBR =to_number(substr(y.k_str,11,5))and x.q_nbr = (case when instr(substr(y.m_str,11,9),’_’) = 6 then to_number(substr(y.m_str,11,5)) when instr(substr(y.m_str,11,9),’_’) = 0 then to_number(substr(y.m_str,11,9)) else 1 end)
Noel
8,3652828 gold badges3939 silver badges6262 bronze badges
answered Nov 8 ’13 at 14:29
Smart CoderSmart Coder
78177 silver badges1313 bronze badges
CASE TO_CHAR(META.RHCONTRATOSFOLHA.CONTRATO)WHEN ’91’ AND TO_CHAR(META.RHCONTRATOSFOLHA.UNIDADE) = ‘0001’ THEN ’91RJ’WHEN ’91’ AND TO_CHAR(META.RHCONTRATOSFOLHA.UNIDADE) = ‘0002’ THEN ’91SP’END CONTRATO,00905. 00000 – “missing keyword”*Cause: *Action:Erro na linha: 15 Coluna: 11
answered Jan 26 ’19 at 13:24
VitorVitor
111 bronze badge
1
DECODE(SUBSTR(STATUS,1,1),’a’,’Active’,’i’,’Inactive’,’t’,’Terminated’,’N/A’)
answered Feb 18 at 11:38
sbrbotsbrbot
5,00733 gold badges3030 silver badges6161 bronze badges