Шрифт:
Интервал:
Закладка:
CASE {<значение 1> | <пустое-предложение>}
WHEN {{NULL | <значение 2>} | <предикат-поиска> }
THEN {<результат 1> | NULL }
WHEN...THEN {<результат 2> | NULL}
[WHEN...THEN {<результат N> | NULL}]
[ELSE {<результат (n + 1)> | NULL} ]
END [, ]
Дополнительные ключевые словаWHEN. . .THEN являются ключевыми словами в каждом предложении условие/результат. Требуется, по меньшей мере, одно предложение условие/результат.
ELSE предшествует необязательному "последнему" результату, который возвращается, если не выполняется ни одно предыдущее предложение.
Аргументызначение 1 является идентификатором столбца, значение которого вычисляется. Может быть опущен. В этом случае каждое предложение WHEN должно быть предикатом поиска, содержащим идентификатор этого столбца.
значение 2 является частью соответствия для условия поиска: простая константа или выражение, которое преобразуется в тип данных, совместимый с типом данных столбца.
* Если идентификатор столбца (значение 1) указан в предложении CASE, то значение 2 остается одиночным в каждом предложении WHEN и будет сравниваться со значением 1.
* Если идентификатор столбца не указан в предложении CASE, то и значение 1, и значение 2 включаются в каждое предложение WHEN в качестве предиката поиска в форме (значение 1 = значение 2).
результат 1 - тот результат, который будет возвращен в случае, когда значение i будет соответствовать значению 2.
результат 2- тот результат, Который будет возвращен в случае, когда значение 1 будет соответствовать значению 3 и т.д.
Возвращаемое значениеПредложение CASE возвращает единственное значение. Если не выполняется ни одно условие и не указано предложение ELSE, то возвращаемый результат будет NULL.
ЗамечанияВы должны использовать одну форму синтаксиса или другую. Смешанный синтаксис недопустим.
Использование единственного предложения условие/результат имеет смысл, только если присутствует предложение ELSE. Хотя это менее элегантно, чем использование соответствующих функций COALESCE() и NULLIF().
ПримерыСледующие два примера демонстрируют, как могут быть использованы каждый из двух вариантов синтаксиса для оперирования с одним и тем же набором предикатов.
Простой синтаксис:
SELECT
о.ID,
о.Description,
CASE о.Status
WHEN 1 THEN 'confirmed'
WHEN 2 THEN 'in production'
WHEN 3 THEN 'ready'
WHEN 4 THEN 'shipped'
ELSE 'unknown status ''' || o.Status || ''''
END
FROM Orders o;
Этот синтаксис использует предикаты поиска в предложении WHEN:
SELECT
о.ID,
о.Description,
CASE
WHEN (о.Status IS NULL) THEN 'new'
WHEN (o.Status = 1) THEN 'confirmed'
WHEN (o.Status = 3) THEN 'in production'
WHEN (o.Status = 4) THEN 'ready'
WHEN (o.Status = 5) THEN 'shipped'
ELSE 'unknown status ''' || o.Status || ''''
END
FROM Orders o;
COALESCE()Функция COALESCE() позволяет вычислять значение столбца с использованием серии выражений, из которых первое выражение, возвращающее непустое значение, вернет выходное значение.
ДоступностьDSQL, PSQL, ISQL, ESQL, Firebird 1.5 и выше. Любая платформа.
СинтаксисCOALESCE (<значение 1> { , значение 2 [, ... значение n]})
Аргументызначение 1 - значение столбца или выражение, которое будет вычисляться. Если это не NULL, то оно будет возвращаемым значением.
значение 2 - значение столбца или выражение, которое будет вычисляться, если значение 1 будет NULL.
значение n - последнее значение или выражение, которое будет вычисляться, если предыдущие значения в списке будут NULL.
Возвращаемое значениеВозвращает первое не NULL значение из списка.
ЗамечанияФункция COALESCE о может быть использована для вычисления пары условий или списка из трех или более условий.
В первом варианте (простого, двоичного) синтаксиса COALESCE (значение1, Значение2) логика вычисления эквивалентна:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END
Если присутствуют три или более аргумента - COALESCE (значение1, значение2, ... значениеN), - логика вычисления эквивалентна следующей:
CASE
WHEN V1 IS NOT NULL THEN V1
ELSE COALESCE (V2,...,Vn)
END
Последнее значение в списке должно быть задано, чтобы быть уверенным, что что-то будет возвращено.
ПримерВ первом запросе если соединение не находит соответствия в таблице EMPLOYEE для TEAM_LEADER из таблицы PROJECT, то запрос вернет строку ' [Not assigned]' (Не назначено) вместо NULL, которое в противном случае должно было вернуть внешнее соединение в качестве значения FULL NAME:
SELECT
PROJ_NAME AS Projectname,
COALESCE (e. FULL_NAME, ' [Not assigned]') AS Employeename
FROM PROJECT p
LEFT JOIN EMPLOYEE e ON (e.EMP_NO = p. TEAM_LEADER) ;
В следующем запросе вычисление начинается с самой левой позиции в списке. Если присутствует значение PHONE, запрос проверяет, присутствует ли значение MOBILEPHONE, иначе он возвращает строку 'unknown' (Неопределенный):
SELECT
COALESCE(Phone, MobilePhone, 'Unknown') AS Phonenumber
FROM Relations
Связанные или похожие функцииПользователи Firebird 1.0.x, смотрите внешние функции INVL() и SNVL().
NULLIF()NULLIF() возвращает NULL в случае соответствия двух непустых значений, иначе он возвращает значение подвыражения.
ДоступностьDSQL, PSQL, ISQL, ESQL, Firebird 1.5 и выше. Любая платформа.
СинтаксисNULLIF (значение 1, значение 2)
Аргументызначение 1 - столбец или вычисляемое выражение.
значение 2- константа или выражение, с которым сравнивается значение 1. Если они соответствуют, NULLIF возвращает NOLL.
Возвращаемое значение
Возвращаемое значение будет NULL, если значение 1 и значение 2 соответствуют друг другу. ЕСЛИ нет соответствия, возвращается значение 1.
ЗамечанияNULLIFO является сокращением для следующего выражения CASE: CASE WHEN(VALUE_1 = value_2) THEN NULL ELSE VALUE_1 END
ПримерЭтот оператор устанавливает значение столбца STOCK из таблицы PRODUCTS в ULL для всех строк, где его текущее значение равно нулю:
UPDATE PRODUCTS
SET STOCK = NULLIF(STOCK, 0)
Связанные или похожие функцииПользователи Firebird 1.0.x, смотрите INULLIF() и SNULLIF().
Определение столбцов COMPUTED BY
В спецификации таблицы вы можете создать столбцы, называемые вычисляемыми, которые хранят не "жесткие" значения, а выражение, вычисляющее значение, когда к столбцу обращается запрос. Выражение, определяемое для столбца, обычно включает значения одного или более других столбцов текущей строки или контекстные переменные сервера. Вот простая иллюстрация:
ALTER TABLE MEMBERSHIP
ADD FULL_NAME COMPUTED BY FIRST_NAME || ' ' || LAST_NAME;
Также возможно использование выражения подзапроса для получения значения такого столбца - эту возможность следует использовать осторожно, исключив нежелательные зависимости. Информацию о вычисляемых столбцах см. в главе 16.
Условия поиска
Возможность конструировать "формулы" для задания условий поиска при выборе наборов, локализации строк при изменениях и удалениях, а также применение правил для создания входных данных является фундаментальной характеристикой языка запросов. Выражения заполняют весь SQL, потому что они обеспечивают алгебру для контекста добавления данных в хранимые абстрактные данные и представления их в виде информации.
Выражения также играют важную роль в контексте разбора входных данных.
Предложения WHEREПредложение WHERE в операторе задает условия для выбора строк выходного набора или определения строк, на которые воздействуют операции (UPDATE, DELETE). Почти все столбцы таблицы могут быть использованы в выражении поиска в предложении WHERE. Если с элементом данных можно оперировать в SQL, то его можно проверять. Вспомните, что предикат поиска является утверждением. Простые или сложные утверждения являются формулами. Мы конструируем формулы для задания условий. Условия должны быть истинными для каждой строки в наборе, с которой оперирует главное предложение нашего запроса.
Инверсия операндовУпрощенный синтаксис предикатов в предложении WHERE имеет вид:
WHERE значение оператор значение
Другими словами, в соответствии с синтаксисом оба следующих утверждения являются правильными:
WHERE ACOL = значение
и
WHERE значение = ACOL
Для предикатов, включающих символы операторов эквивалентности (= и <>), а также некоторые другие (например, LIKE), синтаксический анализатор SQL понимает оба способа и трактует их как эквивалентные. Другие операторы вызовут исключение или неопределенную ошибку при перестановке левой и правой части предиката.
В случае "реверсивных" типов порядок размещения операндов в предикате является вопросом стиля. При этом по опыту автора можно сказать, что читаемость сложных предикатов SQL в исходных кодах клиента и PSQL является обратно пропорциональной количеству предикатов, представленных с проверяемым значением, размещенных справа от оператора, как во втором примере.
- Delphi. Учимся на примерах - Сергей Парижский - Программирование
- Сделай видеоигру один и не свихнись - Слава Грис - Программирование / Руководства
- Психбольница в руках пациентов - Алан Купер - Программирование