Выбрать главу

значение 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 является обратно пропорциональной количеству предикатов, представленных с проверяемым значением, размещенных справа от оператора, как во втором примере.

Например, множество предикатов в форме

<выражение-или-константа> = COLUMNX

делают работу по исправлению ошибок и пересмотру кода каторжным трудом по сравнению с

COLUMNX = <выражение-или-константа>

Важно принимать дополнительные "усилия", чтобы сделать все выражения совместимыми.

Массивы, BLOB и строки

Массивы вовсе не могут использоваться в предикатах поиска, поскольку SQL не имеет средств доступа к хранящимся в массивах данным. Выражения для столбцов BLOB являются весьма ограниченными, BLOB не может сравниваться на равенство ни с другим BLOB, ни с любым другим типом данных. Текстовый BLOB может использоваться в STARTING WITH и с некоторыми ограничениями в предикатах LIKE и CONTAINING. Некоторые внешние функции могут работать с типами BLOB - см. функции BLOB В приложении 1.

Строки могут проверяться любыми операторами сравнения, хотя такие операторы, как <, >, >= и <=, не часто являются полезными.

Условия упорядочения и группирования

Когда выходное поле создается в выражении, оно может быть использовано для установления условий упорядочения или группирования набора. При этом синтаксис правил для выражений в ORDER BY и GROUP BY различается, также существуют различия между версиями 1.0.x и 1.5.

Выражения для ORDER BY

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

SELECT

MEMBER_ID,

LAST_NAME || ', ' || FIRST_NAME AS FULL_NAME,

JOIN_DATE

FROM MEMBERSHIP

ORDER BY 2;

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

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

SELECT DOCUMENTED, TITLE, DESCRIPTION FROM DOCUMENT

ORDER BY STRLEN(DESCRIPTION) DESC;

Выражения для GROUP BY

В SQL оператор GROUP BY используется для собирания наборов данных и иерархической их организации или суммирования.

Во всех версиях Firebird вы можете выполнять иерархическое группирование, основанное на вызове внешней функции (UDF), однако в версии 1.0.x вы не можете использовать порядковый номер выходного столбца в качестве условия группирования. Firebird 1.5 добавляет возможность использования в GROUP BY порядкового номера, а также несколько других типов выражений, включая выражения подзапросов.

Другие изменения в Firebird 1.5 ужесточают отдельные правила группирования, убирая поддержку некоторых неправильных вариантов синтаксиса группирования, которые были допустимы в Firebird 1.0.x.

Правила и взаимодействия выражений для группирования и упорядочения иногда являются сложными в реализации. Эти темы подробно обсуждаются в главе 23.

Следующий пример для версии 1.5 запрашивает в таблице MEMBERSHIP и выводит статистику, показывающую количество участников, объединенных в каждом месяце:

SELECT

MEMBER_TYPE,

EXTRACT(MONTH FROM J0IN_DATE) AS MONTH_NUMBER,

/* 1, 2, и т.д. */

F_CMONTHLONG(JOIN_DATE) AS SMONTH,

/* UDF, возвращающая месяц в виде строки */

COUNT (*) AS MEMBERS_JOINED

FROM MEMBERSHIP

GROUP BY

MEMBER_TYPE, EXTRACT(MONTH FROM JOIN_DATE);

Выражения CHECK в DDL

Применение выражений не ограничивается только DML; мы уже видели их использование в определении таблицы для описания вычисляемых столбцов. Каждый раз, когда вы определяете ограничение CHECK для таблицы, столбца или домена, вы применяете выражения. По своей природе ограничение CHECK выполняет проверку на одно или более значений - тестирует предикат. Вот пример, где проверяется номер сотового телефона участника, который должен начинаться с нуля, если номер вообще присутствует: