Возможно ли сделать такое через параметрический запрос?

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1942
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Возможно ли сделать такое через параметрический запрос?

Сообщение ger_kar » 15.09.2012 (Сб) 23:02

Имеется таблица со списком товаров, в этой таблице есть поле в котором отражается остаток товаров на момент запроса. Записи с товарами которых не осталось в этом поле имеют значение ноль.
Для отбора всех имеющихся в наличии товаров можно составить запрос вида:
SELECT * FROM Goods WHERE Goods.Quantity <> 0;
Для отбора всех отсутствующих товаров нужен уже такой запрос:
SELECT * FROM Goods WHERE Goods.Quantity = 0;
И для вывода все записей, соответсвенно такой:
SELECT * FROM Goods;
Если эти запросы делать в приложении на VB то можно динамически формировать строку с нужным запросом, но меня интересует другое. А именно - возможно ли сделать единый для всех перечисленных случаев параметрический запрос и только менять параметр запроса для вывода нужных результатов. Моя соображалка, как я ее не напрягал, родить, что либо подобное отказывается. Единственное что пришло в голову:
PARAMETERS Par1 Long; SELECT * FROM tgoods WHERE tgoods.kolvo > [Par1]; И соответсвенно для вывода всех записей подставлять - 1, для вывода имеющихся товаров 0, но как тогда быть с отсутствующими товарами я не представляю, да и вариант с параметром -1, тоже на мой взгляд кривоват.
Так вот и вопрос собственно: Делают ли такое параметрическими запросами, если да, то как правильно это сделать?
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.09.2012 (Сб) 23:09

что-то типа
Код: Выделить всё
declare @style nvarchar(16) = N'all'
select * from goods where @style=N'all' or (@style=N'empty' and goods.quantity=0) or (@style=N'nonempty' and goods.quantity<>0)

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1942
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Возможно ли сделать такое через параметрический запрос?

Сообщение ger_kar » 16.09.2012 (Вс) 12:02

Qwertiy писал(а):declare @style nvarchar(16) = N'all'
Что-то запрос какой-то странный, что это за строка с Declare? По крайней мере Access такой запрос не понимает.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 16.09.2012 (Вс) 13:20

Declare - это объявление переменной. Вместе с присваиванием - для SQL-Server 2008+.
Запрос - только select.

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Возможно ли сделать такое через параметрический запрос?

Сообщение HandKot » 17.09.2012 (Пн) 7:06

можно попробовать такой вариант
Код: Выделить всё
PARAMETERS Par1 Long;
SELECT * FROM tgoods WHERE tgoods.kolvo <> 0 And [Par1] <> 0
UNION ALL
SELECT * FROM tgoods WHERE tgoods.kolvo = 0 And [Par1] <= 0;


где Par1 = 0 - отсутствующте товары, 1 - в наличии, -1 - все
I Have Nine Lives You Have One Only
THINK!

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.09.2012 (Пн) 7:16

Чем это лучше моего варианта? Union же приведёт к двум проходам таблицы вместо одного, нет?

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Возможно ли сделать такое через параметрический запрос?

Сообщение HandKot » 17.09.2012 (Пн) 9:37

Qwertiy писал(а):Чем это лучше моего варианта? Union же приведёт к двум проходам таблицы вместо одного, нет?

я не говорил, что это лучше или хуже. Просто привел еще один вариант

Qwertiy писал(а):Union же приведёт к двум проходам таблицы вместо одного, нет?

при наличии индекса по полю kolvo можно будет обойтись и одним проходом. Это справедливо для MSSQL, как будет в Access сказать не могу


ЗЫЖ мне кажется, Ваш вариант гарантировано приведет к сканированию таблицы (наличие предиката OR)
I Have Nine Lives You Have One Only
THINK!

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.09.2012 (Пн) 14:08

HandKot писал(а):ЗЫЖ мне кажется, Ваш вариант гарантировано приведет к сканированию таблицы (наличие предиката OR)

Я считал, что MSSQL такие запросы должен оптимизировать. В любом случае, проход будет один.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4267
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Возможно ли сделать такое через параметрический запрос?

Сообщение iGrok » 17.09.2012 (Пн) 15:22

HandKot писал(а):при наличии индекса по полю kolvo

Индекс на часто меняющемся поле (количестве)?!
Он же будет перестраиваться при каждом изменении кол-ва товара. Или я чего-то не понимаю в работе с базами данных?
label:
cli
jmp label

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Возможно ли сделать такое через параметрический запрос?

Сообщение HandKot » 17.09.2012 (Пн) 15:57

Или я чего-то не понимаю в работе с базами данных?

ну тогда снимаю свой пост :)
I Have Nine Lives You Have One Only
THINK!

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1942
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Возможно ли сделать такое через параметрический запрос?

Сообщение ger_kar » 17.09.2012 (Пн) 16:07

iGrok писал(а):Индекс на часто меняющемся поле (количестве)?! Он же будет перестраиваться при каждом изменении кол-ва товара.
Ну скорее всего так и есть, по крайней мере логика и здравый смысл подсказывают именно это :) .
HandKot писал(а):ну тогда снимаю свой пост
Почему-же, как один из вариантов решения он мне понравился, другое дело, что для поля Количество индекс не очень подходит, хотя для какого нибудь другого может вполне подойти :)

А вообще конечно жаль, что в качестве параметра нельзя использовать выражение, было очень даже не плохо.
Например так:
SELECT * FROM tgoods WHERE [Param]; , где вместо Param могло бы быть как выражение
Param = tgoods.kolvo <> 0, так и выражение tgoods.kolvo = 0, или просто True для вывода всех результатов
Бороться и искать, найти и перепрятать


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList