Россия, г. Санкт-Петербург |
Лекция 20: Расширенное описание T-SQL
Ключевые слова для программирования
Вместе с операторами T-SQL можно использовать несколько полезных ключевых слов, позволяющих создавать программные конструкции для управления программной последовательностью. Эти конструкции можно использовать внутри пакетов (групп операторов T-SQL, которые выполняются за один раз), хранимых процедур, сценариев и эпизодических ( ad hoc ) запросов. (Для примеров в этом разделе используется база данных pubs.)
IF...ELSE
Конструкция IF...ELSE используется для наложения условий, определяющих, какие операторы T-SQL нужно выполнить. Для IF...ELSE используется следующий синтаксис:
IF Булево_выражение Оператор_T-SQL | блок_операторов [ELSE Оператор_T-SQL | блок_операторов]
Булево_выражение возвращает значение TRUE или FALSE. Если выражение в предложении IF возвращает значение TRUE, то выполняются следующие операторы, а предложение ELSE и его операторы не выполняются. Если выражение возвращает значение FALSE, то выполняются только операторы, следующие после ключевого слова ELSE. Блок_операторов просто указывает на использование более чем одного оператора T-SQL. При использовании блока операторов вы должны задавать ключевые слова BEGIN и END, указывающие начало и конец каждого блока, – будь то блок в предложении IF, предложении ELSE или в обоих предложениях.
Вы можете использовать предложение IF без предложения ELSE. Рассмотрим сначала пример, где используется только IF. В следующем примере происходит проверка выражения, и если результатом этого выражения является значение TRUE, то выполняется последующий оператор PRINT:
IF (SELECT ytd_sales FROM titles WHERE title_id = 'PC1035') > 5000 PRINT 'Year-to-date sales are greater than $5,000 for PC1035.' GO
Значение выражения IF будет равно TRUE, поскольку значение ytd_sales для строки с title_id = "PC1035" равно 8780. Будет выполнен оператор PRINT, и на экране будет выведен текст "Year-to-date sales are greater than $5,000 for PC1035" (Объем продаж на текущий год для PC1035 больше $5000).
А теперь добавим к предыдущему примеру предложение ELSE и изменим > 5000 на > 9000. Соответствующий пример показан ниже:
IF (SELECT ytd_sales FROM titles WHERE title_id = 'PC1035') > 9000 PRINT 'Year-to-date sales are greater than $9,000 for PC1035.' ELSE PRINT 'Year-to-date sales are less than or equal to $9,000 for PC1035.' GO
В данном случае будет выполнен оператор PRINT, следующий после предложения ELSE, поскольку выражение IF возвращает значение FALSE.
Расширим этот пример, добавив блоки операторов после предложений IF и ELSE. Выводимое сообщение и выполняемый запрос будут зависеть от значения выражения IF ( TRUE или FALSE ). Ниже приводится этот пример:
IF (SELECT ytd_sales FROM titles WHERE title_id = 'PC1035') > 9000 BEGIN PRINT 'Year-to-date sales are greater than $9,000 for PC1035.' SELECT ytd_sales FROM titles WHERE title_id = 'PC1035' END ELSE --ytd_sales должно быть <= 9000. BEGIN PRINT 'Year-to-date sales are less than or equal to $9,000 for PC1035.' SELECT price FROM titles WHERE title_id = 'PC1035' END GO
Если значение выражения IF равно FALSE, то выполняются операторы между BEGIN и END в предложении ELSE. Сначала выполняется оператор PRINT и затем – оператор SELECT, показывающий, что книга стоит $22.95.
Вы можете также использовать вложенные операторы IF после предложения IF или после предложения ELSE. Например, чтобы использовать вложенные операторы IF...ELSE для определения диапазона, в который попадает среднее значение ytd_sales для всех заголовков, выполните следующий пример:
IF (SELECT avg(ytd_sales) FROM titles) < 10000 IF (SELECT avg(ytd_sales) FROM titles) < 5000 IF (SELECT avg(ytd_sales) FROM titles) < 2000 PRINT 'Average year-to-date sales are less than $2,000.' ELSE PRINT 'Average year-to-date sales are between $2,000 and $4,999.' ELSE PRINT 'Average year-to-date sales are between $5,000 and $9,999.' ELSE PRINT 'Average year-to-date sales are greater than $9,999.' GO
При выполнении этого примера вы дважды увидите среди результатов следующее предупреждающее сообщение: "Warning: Null value eliminated from aggregate" (Предупреждение: Значение Null исключено из совокупности). Это сообщение просто означает, что пустые значения ( null ) колонки ytd_sales не учитывались как значения при расчете среднего значения. Конечным результатом этого примера будет "Average year-to-date sales are between $5,000 and $9,999" (Среднее значение продаж на текущий год в диапазоне от $5000 до $9999), поскольку среднее значение равно $6090. Будьте аккуратны при использовании вложенных операторов IF. Можно легко запутаться в том, какой IF относится к очередному ELSE, или оставить IF без соответствующего ELSE. Использование символов табуляции для отступов, как в предыдущем примере, упрощает определение соответствующих пар IF...ELSE.