Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Формирование условия WHERE  [new]
klev2004
Member

Откуда:
Сообщений: 8
Добрый день!

Имеется форма, с которой могут приходить 6 параметров, три последних, при этом, являются необязательными (т.е. приходят пустыми).
Все переменные участвуют в условии WHERE в качестве значений для параметров выборки.

Пример 1:

ParamA = 1
ParamB = 'text'
ParamC = 10
ParamD = 'text2'
ParamE = 'text3'
ParamF = 'text4'

SELECT * FROM table WHERE RowA=1 AND RowB='text' AND RowC=10 AND RowD='text2' AND RowE='text3' AND RowF='text4'


Пример 2:

ParamA = 1
ParamB = 'text'
ParamC = 10
ParamD = ''
ParamE = ''
ParamF = ''

SELECT * FROM table WHERE RowA=1 AND RowB='text' AND RowC=10


Помогите, пожалуйста, разобраться с проблемой.
21 авг 13, 18:44    [14738353]     Ответить | Цитировать Сообщить модератору
 Re: Формирование условия WHERE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
klev2004,

FAQ Переменное число критериев отбора в запросе
21 авг 13, 19:06    [14738442]     Ответить | Цитировать Сообщить модератору
 Re: Формирование условия WHERE  [new]
Finsman
Member

Откуда: Da UK.
Сообщений: 404
Так подойдёт?

SELECT * 
FROM table 
WHERE RowA=1 AND RowB='text' AND RowC=10 

AND RowD LIKE 'text2'+'%' 
AND RowE LIKE 'text3'+'%' 
AND RowF LIKE 'text4'+'%'
21 авг 13, 19:09    [14738448]     Ответить | Цитировать Сообщить модератору
 Re: Формирование условия WHERE  [new]
klev2004
Member

Откуда:
Сообщений: 8
Гость333,

Спасибо, эту статью я читал. Пробовал преобразовать приведенный там запрос к моей ситуации. К сожалению, не вышло. Помогите пожалуйста.
21 авг 13, 19:09    [14738450]     Ответить | Цитировать Сообщить модератору
 Re: Формирование условия WHERE  [new]
Finsman
Member

Откуда: Da UK.
Сообщений: 404
Когда параметры не передаются( т.е. передаются пустые строки), то будет так:

SELECT * 
FROM table 
WHERE RowA=1 AND RowB='text' AND RowC=10 

AND RowD LIKE ''+'%' 
AND RowE LIKE ''+'%' 
AND RowF LIKE ''+'%'
21 авг 13, 19:13    [14738461]     Ответить | Цитировать Сообщить модератору
 Re: Формирование условия WHERE  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а запрос собрать на клиенте - не предлагать?
лишние "пустые" условия в WHERE тоже кушают ресурсы
21 авг 13, 19:15    [14738470]     Ответить | Цитировать Сообщить модератору
 Re: Формирование условия WHERE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
klev2004
Гость333,

Спасибо, эту статью я читал. Пробовал преобразовать приведенный там запрос к моей ситуации. К сожалению, не вышло. Помогите пожалуйста.

Не очень понял, что у вас за параметры. Предположим, это переменные. Тогда
SELECT *
FROM table
WHERE RowA=@ParamA AND RowB=@ParamB AND RowC=@ParamC AND
     (RowD=@ParamD OR @ParamD='') AND (RowE=@ParamE OR @ParamE='') AND (RowF=@ParamF OR @ParamF='')

Если значения необязательных параметров, кроме пустой строки, могут быть NULL, тогда три последних условия могут выглядеть примерно так:
(RowD=@ParamD OR @ParamD='' OR @ParamD IS NULL)
22 авг 13, 09:06    [14739456]     Ответить | Цитировать Сообщить модератору
 Re: Формирование условия WHERE  [new]
klev2004
Member

Откуда:
Сообщений: 8
Crimean
а запрос собрать на клиенте - не предлагать?
лишние "пустые" условия в WHERE тоже кушают ресурсы


К сожалению, на стороне клиента нет возможности собрать запрос.


Гость333
Не очень понял, что у вас за параметры. Предположим, это переменные. Тогда
SELECT *
FROM table
WHERE RowA=@ParamA AND RowB=@ParamB AND RowC=@ParamC AND
     (RowD=@ParamD OR @ParamD='') AND (RowE=@ParamE OR @ParamE='') AND (RowF=@ParamF OR @ParamF='')

Если значения необязательных параметров, кроме пустой строки, могут быть NULL, тогда три последних условия могут выглядеть примерно так:
(RowD=@ParamD OR @ParamD='' OR @ParamD IS NULL)


Спасибо! Ваш пример оказался очень полезным для моей ситуации. Проблема решена.
22 авг 13, 11:15    [14740164]     Ответить | Цитировать Сообщить модератору
 Re: Формирование условия WHERE  [new]
Crimean
Member

Откуда:
Сообщений: 13147
2 klev2004

> К сожалению, на стороне клиента нет возможности собрать запрос.
> Спасибо! Ваш пример оказался очень полезным для моей ситуации. Проблема решена.

тогда ответ на ваш следующий вопрос - "почему иногда так сильно тормозит" будет "используйте OPTION( RECOMPILE )"
22 авг 13, 11:35    [14740313]     Ответить | Цитировать Сообщить модератору
 Re: Формирование условия WHERE  [new]
klev2004
Member

Откуда:
Сообщений: 8
Crimean,

запрос выполнен не в виде хранимой процедуры, поэтому, надеюсь проблема возникнуть не должна.

В итоге, бывший проблемным кусок запроса, выглядит так.

DECLARE @Param1 integer = nullif([Param.1], '');
DECLARE @Param2 datetime = nullif([Param.2], '');
DECLARE @Param3 datetime = nullif([Param.3], '');
DECLARE @Param4 nvarchar(50) = nullif([Param.4], '');
DECLARE @Param5 nvarchar(50) = nullif([Param.5], '');
DECLARE @Param6 integer = nullif([Param.6], '');

...

WHERE Param1=@Param1 AND Param2=@Param2 AND Param3=@Param3 AND
     (Param4=@Param4 OR @Param4 IS NULL) AND (Param5=@Param5 OR @Param5 IS NULL) AND (Param6 = @Param6 OR @Param6 IS NULL)
27 авг 13, 13:26    [14760234]     Ответить | Цитировать Сообщить модератору
 Re: Формирование условия WHERE  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
klev2004,

То есть, если хотя бы один из первых трёх параметров будет равен пустой строке или NULL, вернётся пустой рекордсет.
Это нормально? Ну и ладно!

А как можно переменную записать в виде [Param.1], не подскажете?
Разве переменная не должна начинаться с символа @ ???
27 авг 13, 13:45    [14760384]     Ответить | Цитировать Сообщить модератору
 Re: Формирование условия WHERE  [new]
SET ANSI_NULLS OFF
Guest
iap
То есть, если хотя бы один из первых трёх параметров будет равен пустой строке или NULL, вернётся пустой рекордсет.
Это нормально? Ну и ладно!


может вернуть и не пустой, SET ANSI_NULLS OFF пока еще (2012) работает.
27 авг 13, 14:07    [14760548]     Ответить | Цитировать Сообщить модератору
 Re: Формирование условия WHERE  [new]
Crimean
Member

Откуда:
Сообщений: 13147
klev2004
запрос выполнен не в виде хранимой процедуры, поэтому, надеюсь проблема возникнуть не должна


как раз поэтому и должна. и, скорее всего, возникнет. так как хранимку будут дергать с разными значениями параметров, а план пересоздаваться будет куда как реже ибо от значений параметров он не зависит by design
27 авг 13, 14:16    [14760631]     Ответить | Цитировать Сообщить модератору
 Re: Формирование условия WHERE  [new]
ad-hoc запрос
Guest
Crimean
klev2004
запрос выполнен не в виде хранимой процедуры, поэтому, надеюсь проблема возникнуть не должна


как раз поэтому и должна. и, скорее всего, возникнет. так как хранимку будут дергать с разными значениями параметров, а план пересоздаваться будет куда как реже ибо от значений параметров он не зависит by design


я так понимаю это ad-hoc запрос, в который в нужные места ([Param.1], [Param.2] и т.п) на клиенте подставляются значения параметров, соответственно для каждого набора параметров будет свой план
27 авг 13, 14:20    [14760660]     Ответить | Цитировать Сообщить модератору
 Re: Формирование условия WHERE  [new]
Crimean
Member

Откуда:
Сообщений: 13147
опс. сори, "НЕ" - просмотрел!
p.s.
надеюсь, с датами / строками проблем не будет
27 авг 13, 15:26    [14761035]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить