При работе с SQL Server иногда возникает необходимость изменять результаты статического SQL-запроса на основе определенных условий или переменных. Создание нескольких запросов с незначительными отличиями может быть трудоемким и неэффективным. В этой статье мы рассмотрим некоторые техники, которые позволяют динамически изменять результаты статического SQL-запроса с использованием переменных.
Пример 1 – Больше и Меньше
Предположим, мы хотим получить всех сотрудников, у которых день рождения больше или меньше определенной даты. Вместо создания отдельных запросов для каждого условия мы можем использовать функцию CASE и переменную для динамического определения условия больше или меньше в операторе WHERE.
DECLARE @Sign char(1), @date datetime
SET @Sign = '>'
SET @date = '7/3/1963'
SELECT *
FROM employees
WHERE CASE @Sign
WHEN '>' THEN BirthDate
WHEN '<' THEN @date
END >
CASE @Sign
WHEN '>' THEN @date
WHEN '<' THEN BirthDate
END
Изменяя значение переменной @Sign, мы можем получать сотрудников с датой рождения, большей или меньшей указанной даты.
Пример 2 – Исключение условий в операторе WHERE
В этом примере мы продемонстрируем, как переменные могут быть использованы для исключения или включения различных условий в операторе WHERE. Предположим, мы хотим фильтровать сотрудников по фамилии и имени.
DECLARE @LastName varchar(30), @FirstName varchar(30)
SET @LastName = 'd'
SET @FirstName = 'a'
SELECT *
FROM employees
WHERE CASE
WHEN @LastName <> '' THEN LastName
WHEN @LastName = '' THEN 'Исключить'
END LIKE
CASE
WHEN @LastName <> '' THEN @LastName + '%'
WHEN @LastName = '' THEN 'Исключить'
END
AND
CASE
WHEN @FirstName <> '' THEN FirstName
WHEN @FirstName = '' THEN 'Исключить'
END LIKE
CASE
WHEN @FirstName <> '' THEN @FirstName + '%'
WHEN @FirstName = '' THEN 'Исключить'
END
Изменяя значения переменных @LastName и @FirstName, мы можем включать или исключать определенные условия в операторе WHERE. Это позволяет динамически фильтровать результаты на основе предоставленных переменных.
Пример 3 – Каскадные условия в операторе WHERE
В этом примере мы рассмотрим каскадные условия в операторе WHERE. Эта техника включает использование переменных с определенным приоритетом, где каждая функция CASE берет первое соответствующее условие и переходит к следующему. Предположим, мы хотим фильтровать сотрудников по должности, стране, городу, фамилии и имени.
DECLARE @LastName varchar(30), @FirstName varchar(30), @Country varchar(5), @City varchar(20), @Title varchar(30)
SET @Country = 'usa'
SET @City = 'k'
SET @LastName = ''
SET @FirstName = ''
SET @Title = 's'
SELECT *
FROM employees
WHERE CASE
WHEN @Title <> '' THEN Title
WHEN @Country <> '' THEN Country
WHEN @City <> '' THEN City
WHEN @LastName <> '' THEN LastName
WHEN @FirstName <> '' THEN FirstName
END LIKE
CASE
WHEN @Title <> '' THEN @Title + '%'
WHEN @Country <> '' THEN @Country
WHEN @City <> '' THEN '%' + @City + '%'
WHEN @LastName <> '' THEN @LastName + '%'
WHEN @FirstName <> '' THEN @FirstName + '%'
END
AND
CASE
WHEN @Title <> '' THEN CASE WHEN @Country = '' THEN 'Исключить' ELSE Country END
WHEN @Country <> '' THEN CASE WHEN @City = '' THEN 'Исключить' ELSE City END
WHEN @City <> '' THEN CASE WHEN @LastName = '' THEN 'Исключить' ELSE LastName END
WHEN @LastName <> '' THEN CASE WHEN @FirstName = '' THEN 'Исключить' ELSE FirstName END
WHEN @LastName = '' THEN 'Исключить'
WHEN @FirstName = '' THEN 'Исключить'
END LIKE
CASE
WHEN @Title <> '' THEN CASE WHEN @Country = '' THEN 'Исключить' ELSE @Country END
WHEN @Country <> '' THEN CASE WHEN @City = '' THEN 'Исключить' ELSE @City + '%' END
WHEN @City <> '' THEN CASE WHEN @LastName = '' THEN 'Исключить' ELSE '%' + @LastName + '%' END
WHEN @LastName <> '' THEN CASE WHEN @FirstName = '' THEN 'Исключить' ELSE '%' + @FirstName + '%' END
WHEN @LastName = '' THEN 'Исключить'
WHEN @FirstName = '' THEN 'Исключить'
END
AND
CASE
WHEN @Title <> '' THEN City
WHEN @Country <> '' THEN LastName
WHEN @City <> '' THEN FirstName
WHEN @LastName = '' THEN 'Исключить'
WHEN @LastName <> '' THEN 'Исключить'
WHEN @FirstName <> '' THEN 'Исключить'
END LIKE
CASE
WHEN @Title <> '' THEN '%' + @City + '%'
WHEN @Country <> '' THEN @LastName + '%'
WHEN @City <> '' THEN '%' + @FirstName + '%'
WHEN @LastName = '' THEN 'Исключить'
WHEN @LastName <> '' THEN 'Исключить'
WHEN @FirstName <> '' THEN 'Исключить'
END
Изменяя значения переменных, мы можем контролировать, какие условия применяются в операторе WHERE. Это позволяет динамически фильтровать результаты на основе предоставленных переменных с систематическим способом выбора условий, которые должны быть использованы.
Заключение
Эти техники демонстрируют, как статические SQL-запросы могут быть изменены для возврата разных записей на основе значений переменных. Используя эти техники, вы можете разрабатывать более компактный и эффективный код, избегая необходимости в создании нескольких запросов с незначительными отличиями. Это предоставляет альтернативу использованию динамического SQL и позволяет более гибко выполнять запросы к базе данных.