Опубликован: 11.12.2006 | Доступ: свободный | Студентов: 5361 / 282 | Оценка: 4.42 / 3.86 | Длительность: 57:15:00

Лекция 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.

Евгений Калько
Евгений Калько
Россия, Омск, Омский государственный университет
Андрей Панков
Андрей Панков
Россия, г. Челябинск, Южно-Уральский государственный университет, 2012