Published on

August 17, 2017

Исследование техник модификации запросов SQL Server

При работе с 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 и позволяет более гибко выполнять запросы к базе данных.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.