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

Откуда: Не от мира сего
Сообщений: 667
Есть таблица
Каким образом организовать такую вещь:

Есть 5 параметров и нужно сделать выборку в зависимости от заполнения этих параметров
например
если заполнены 3 параметра из 5 то сделать выборку только по этим трем параметрам и т.д. и т.п.
тоесть что то типа :

select * from #t1
where

if (p1 <> null) field1=@p1
if (p2 <> null) field2=@p2
if (p3 <> null) field3=@p3
if (p4 <> null) field4=@p4
if (p5 <> null) field5=@p5

вот примерно как то так.


Не откладывай на завтра то что можно сделать послезавтра :)
27 авг 13, 06:46    [14758244]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
SkyS,

FAQ - Переменное число критериев сортировки результатов
27 авг 13, 07:04    [14758254]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
SkyS
Member

Откуда: Не от мира сего
Сообщений: 667
немного не то.
Мне получается нужно использовать эти условия в блоке Where.
И опять же повторюсь параметров может быть несколько и в разном порядке.
Допустим задан только 1,4 и 5 параметр или 2,3,4 и 5.
В зависимости от этого и должно формироваться условие выбора.
Если делать подобным образом (как в FAQ) то мне придется расписывать все возможные варианты
выборки руками, чего хотелось бы избежать (просто неудобно получиться).
27 авг 13, 07:33    [14758273]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
SkyS,
Вот здесь этот вопрос подробно освещен, правда на языке вероятного противника
Dynamic Search Conditions in T-SQL
27 авг 13, 07:42    [14758278]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
SkyS
Member

Откуда: Не от мира сего
Сообщений: 667
Ruuu
SkyS,
Вот здесь этот вопрос подробно освещен, правда на языке вероятного противника
Dynamic Search Conditions in T-SQL


Да сделал примерно тоже самое .
    SET @SQLTEXT_QUERY = ' '
    
    IF (@DTPROIZV <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND substring (K.KOD,3,5) = ' + @DTPROIZV  
    IF (@DTPOST <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND JPD = CONVERT(VARCHAR(10), '''+@DTPOST+''', 112)  ' 
    IF (@DTVID <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND JRD = CONVERT(VARCHAR(10), '''+@DTVID+''', 112)  ' 
    IF (@VZR_ID <> 0) SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND JVV =  ' + CAST( @VZR_ID as varchar(10) ) 
    IF (@DTRASHOD <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + 'AND JVD = CONVERT(VARCHAR(10), '''+@DTRASHOD+''', 112)  ' 
    IF (@DTRETURN <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND JRETD = CONVERT(VARCHAR(10),'''+@DTRETURN+''', 112)  ' 
       
    SET @SQLTEXT= 'SELECT * FROM #T WHERE ID=ID ' + @SQLTEXT_QUERY
  EXEC (@SQLTEXT)


вот как то так =)
27 авг 13, 08:22    [14758327]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
SkyS,

тогда уж лучше использовать параметризованные запросы с sp_executesql, чтобы у вас при каждом запуске процедуры не пересоздавался план запроса. + защита от sql инъекций.
27 авг 13, 08:35    [14758351]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
Алексей Куренков
Member [заблокирован]

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

Подобные задачи в инлайн функциях делал не заморачиваясь (и работает на 5+) примерно так

select field1, field2 from tbl1 where @p1 in (1,2)
union all
select field1, field2 from tbl2 where @p1 in (3,4,5)
union all
select f1, f2 from tbl 3 where @p1 not in (1,2,3,4,5) or @p1 is null
27 авг 13, 08:36    [14758355]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
SkyS
Member

Откуда: Не от мира сего
Сообщений: 667
Ruuu
SkyS,

тогда уж лучше использовать параметризованные запросы с sp_executesql, чтобы у вас при каждом запуске процедуры не пересоздавался план запроса. + защита от sql инъекций.


то есть что то типо этого (та ссылочка что вы давали выше)?
SELECT @paramlist = '@xorderid   int,                              -- 75
                     @xfromdate  datetime,                         -- 76
                     @xtodate    datetime,                         -- 77
                     @xminprice  money,                            -- 78
                     @xmaxprice  money,                            -- 79
                     @xcustid    nchar(5),                         -- 80
                     @xcustname  nvarchar(40),                     -- 81
                     @xcity      nvarchar(15),                     -- 82
                     @xregion    nvarchar(15),                     -- 83
                     @xcountry   nvarchar(15),                     -- 84
                     @xprodid    int,                              -- 85
                     @xprodname  nvarchar(40)'                     -- 86
                                                                   -- 87
EXEC sp_executesql @sql, @paramlist,                               -- 88
                   @orderid, @fromdate, @todate, @minprice,        -- 89
                   @maxprice,  @custid, @custname, @city, @region, -- 90
                   @country, @prodid, @prodname                    -- 91
27 авг 13, 08:52    [14758414]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
SkyS,

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

    SET @SQLTEXT_QUERY = ' '
    
    IF (@DTPROIZV <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND substring (K.KOD,3,5) = @DTPROIZV '
    IF (@DTPOST <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND JPD = @DTPOST  ' 
    IF (@DTVID <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND JRD =@DTVID  ' 
    IF (@VZR_ID <> 0) SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND JVV = @VZR_ID ' 
    IF (@DTRASHOD <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + 'AND JVD = @DTRASHOD ' 
    IF (@DTRETURN <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND JRETD = @DTRETURN  ' 
27 авг 13, 08:59    [14758442]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SkyS
if (p1 <> null)

Надеюсь, вы в курсе, что так сравнивать с null'ом нельзя?
27 авг 13, 09:44    [14758701]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
SkyS
if (p1 <> null)


if p1 is not null
27 авг 13, 09:46    [14758713]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
SkyS
Member

Откуда: Не от мира сего
Сообщений: 667
Гость333
SkyS
if (p1 <> null)

Надеюсь, вы в курсе, что так сравнивать с null'ом нельзя?

Это просто схематическое написание
27 авг 13, 09:50    [14758736]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
SkyS
Member

Откуда: Не от мира сего
Сообщений: 667
Ruuu
SkyS,

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

    SET @SQLTEXT_QUERY = ' '
    
    IF (@DTPROIZV <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND substring (K.KOD,3,5) = @DTPROIZV '
    IF (@DTPOST <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND JPD = @DTPOST  ' 
    IF (@DTVID <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND JRD =@DTVID  ' 
    IF (@VZR_ID <> 0) SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND JVV = @VZR_ID ' 
    IF (@DTRASHOD <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + 'AND JVD = @DTRASHOD ' 
    IF (@DTRETURN <> '0') SET @SQLTEXT_QUERY = @SQLTEXT_QUERY + ' AND JRETD = @DTRETURN  ' 


СПС! перепишу процедурку =)
27 авг 13, 09:51    [14758743]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
Lily V.
Member

Откуда: Магнитогорск
Сообщений: 92
SkyS,

Или так:
SELECT * FROM #t1 
WHERE ((@p1 = NULL) OR (field1 = @p1))
  AND ((@p2 = NULL) OR (field2 = @p2))
... и т.д.
27 авг 13, 10:15    [14758875]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Lily V.
WHERE ((@p1 = NULL)

Вы тоже, на всякий, почитайте про NULL
27 авг 13, 10:20    [14758901]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
Lily V.
Member

Откуда: Магнитогорск
Сообщений: 92
Гость333
Lily V.
WHERE ((@p1 = NULL)

Вы тоже, на всякий, почитайте про NULL
28 авг 13, 13:39    [14765782]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблицы в зависимости от параметров.  [new]
Lily V.
Member

Откуда: Магнитогорск
Сообщений: 92
Гость333
Lily V.
WHERE ((@p1 = NULL)

Вы тоже, на всякий, почитайте про NULL

Спасибо, не надо. Естественно, в реальных запросах на нулл сравниваю по-другому. Просто эта конструкция была написана, как говорится, на коленке из исходного поста. Прошу прощения, что не проверила
28 авг 13, 13:40    [14765797]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить