Brief
SQL Server 2012 представил логическую функцию IIF
. Используя SQL Server 2012 или новее, вы можете теперь использовать эту новую функцию вместо выражения CASE
. Функция IIF
также работает с Базой данных SQL Azure (но в настоящее время она не работает с Хранилищем данных SQL Azure или Хранилище параллельных данных ). Это сокращение для выражения CASE
.
Я обнаружил, что использую функцию IIF
вместо выражения CASE
, когда есть только один случай. Это облегчает боль от необходимости писать CASE WHEN condition THEN x ELSE y END
и вместо этого писать IIF(condition, x, y)
. Если могут быть выполнены несколько условий (несколько WHEN
с), вместо этого вам следует рассмотреть возможность использования регулярного выражения CASE
вместо вложенных IIF
функций.
Возвращает одно из двух значений, в зависимости от того, является ли логическое выражение
в SQL Server принимает значение true или false.
Синтаксис
IIF ( boolean_expression, true_value, false_value )
Аргументы
boolean_expression
Допустимое логическое выражение.
Если этот аргумент не является логическим выражением, синтаксическая ошибка
поднял.
true_value
Возвращаемое значение, если boolean_expression
оценивается как
правда.
false_value
Возвращаемое значение, если boolean_expression
оценивает
в ложь.
Примечания
IIF
- это сокращенный способ написания выражения CASE
. Оценивает
логическое выражение передается в качестве первого аргумента, а затем возвращает
любой из двух других аргументов, основанных на результате
оценка. То есть true_value
возвращается, если логическое значение
выражение истинно, и false_value
возвращается, если логическое значение
выражение ложно или неизвестно. true_value
и false_value
могут быть
любого типа. Те же правила, которые применяются к выражению CASE
для
Булевы выражения, нулевая обработка и возвращаемые типы также применяются к
IIF
. Для получения дополнительной информации см. CASE
(Transact-SQL) .
Тот факт, что IIF
переведен в CASE
, также влияет на
другие аспекты поведения этой функции. С CASE
выражения могут быть вложены только до уровня 10, IIF
операторов
также может быть вложен только до максимального уровня 10. Также, IIF
удаленный на другие серверы как семантически эквивалентный CASE
выражение, со всеми поведениями удаленного CASE
выражения.
Код
Реализация функции IIF
в SQL будет выглядеть следующим образом (с использованием той же логики, представленной @ rsbarro в его ответе ):
SELECT
COUNT(
IIF(jobs.status_id NOT IN (8,3,11), 1, 0)
) as active_count,
COUNT(
IIF(jobs.due_date < '2011-06-14' AND jobs.status_id NOT IN(8,11,5,3), 1, 0)
) as overdue_count,
COUNT(
IIF(jobs.due_date BETWEEN '2011-06-14' AND '2011-06-15 06:00:00.000000', 1, 0)
) as due_today_count
FROM
"jobs"
WHERE
jobs.creator_id = 5