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

Откуда: Симферополь
Сообщений: 538
Господа, как мне в условии
where a.Price3 <> 0   --надо смотреть ценовую группу склада
заменить на более гибкое:
если PriceStock =1 тогда условие a.Price1 <> 0
если PriceStock =2 тогда условие a.Price2 <> 0
если PriceStock =3 тогда условие a.Price3 <> 0

Пытался написать case в where - пишет ошибку. Заранее благодарен.
Вот код процедуры:
ALTER procedure [dbo].[Client_AB_ExportXML] 
	(@StockRef integer, @ID_Dev varchar(10))
as

declare @PriceStock integer
set @PriceStock = (select IntField1 from Stock where ID = @StockRef)

delete from Client_AB_ExportArt
insert into Client_AB_ExportArt
select
@ID_Dev as ID,							--ID устройства в учетной системе клиента
a.Code as code,							--Код (номер) товара
--LEFT(a.NameArticle1, 18) as ITEM,       --Наименование артикула 18 символов
LEFT (replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(a.NameArticle1,'&',''),'/',''),'\', ''), '№', ''), '`', ''),'-',''),'+',''), ',', ''), '*', ''), '''',''), 18) as ITEM,
case @PriceStock                        --В зависимости от ценовой группы
	when 1 then a.price1
	when 2 then a.price2
	when 3 then a.price3
	when 4 then a.price4
	when 5 then a.price5
	when 6 then a.price6
	when 7 then a.price7
	when 8 then a.price8
	when 9 then a.price9
	when 10 then a.price10
end as price,
case a.r_IDVat
	when 11 then 1
	when 5  then 5
	when 2  then 1
	when 0  then 1
end as tax,								--Налоговая группа
0 as single_sale,						--Признак одиночной продажи товара
sum(iop.AvQuantHd)*1000 as quantity,	--Количество (запас) товара
a.BarCode as barcode,                   --Штрихкод товара
1         as department,                --Отдел, к которому принадлежит товар
1         as [group],                   --Группа товара
1         as free_price,                --Признак разрешения свободной цены
case u.ID
	when 0 then 0
	when 10020 then 0
    when 10022 then 1 else 0
end	as divisibility,					--Признак делимости товара 0 – неделимый (штучный) товар 1 – делимый (весовой) товар
0 as ctrl_qnt,                          --Признак контроля количественного запаса товара
0 as rqst_qnt,                          --0 не осуществлять запрос на продажу товара
0 as only_ret,                          --Признак разрешения только возврата товара 0 – товар можно продавать и возвращать
0 as disable_ret,                       --Признак запрета возврата товара
0 as cmplx_sale,                        --Признак продажи товаров только при комплексной продаже
0 as [delete],                          --Признак удаления товара 0 – не удалять товар
iop.r_IDArticle,
@StockRef as r_IDStock
from InvObjPast iop inner join Article a on a.ID = iop.r_IDArticle
					inner join Units u   on u.ID = a.r_IDUnits					
where iop.r_IDStock = @StockRef
and iop.BlockQuant = 0
and a.Price3 <> 0						--надо смотреть ценовую группу склада
group by a.Code, a.NameArticle1, a.BarCode, a.r_IDVat, iop.r_IDArticle,
case @PriceStock
	when 1 then a.price1
	when 2 then a.price2
	when 3 then a.price3
	when 4 then a.price4
	when 5 then a.price5
	when 6 then a.price6
	when 7 then a.price7
	when 8 then a.price8
	when 9 then a.price9
	when 10 then a.price10
end,
case u.ID
	when 0 then 0
	when 10020 then 0
    when 10022 then 1 else 0
end
having sum(iop.AvQuantHd) > 0
order by iop.r_IDArticle
8 июл 12, 08:31    [12835075]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать гибкое условие where  [new]
qwerty112
Guest
Andrew_vb1110
Пытался написать case в where - пишет ошибку. Заранее благодарен.

1
можно написать case без ошибки
2
...and ((PriceStock =1 and a.Price1 <> 0) or (PriceStock =2 and a.Price2 <> 0) or (PriceStock =3 and a.Price3 <> 0))

(хуже, имхо)
8 июл 12, 10:26    [12835113]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать гибкое условие where  [new]
Andrew_vb1110
Member

Откуда: Симферополь
Сообщений: 538
qwerty112
Andrew_vb1110
Пытался написать case в where - пишет ошибку. Заранее благодарен.

1
можно написать case без ошибки
2
...and ((PriceStock =1 and a.Price1 <> 0) or (PriceStock =2 and a.Price2 <> 0) or (PriceStock =3 and a.Price3 <> 0))

(хуже, имхо)


Я писал case так:
case @PriceStock
	when 1 then a.price1
	when 2 then a.price2
	when 3 then a.price3
	when 4 then a.price4
	when 5 then a.price5
	when 6 then a.price6
	when 7 then a.price7
	when 8 then a.price8
	when 9 then a.price9
	when 10 then a.price10
end

где тут ошибка?
8 июл 12, 10:37    [12835125]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать гибкое условие where  [new]
qwerty112
Guest
а где "<>0" ?
Andrew_vb1110

Я писал case так:
where
case @PriceStock
	when 1 then a.price1
	when 2 then a.price2
	when 3 then a.price3
	when 4 then a.price4
	when 5 then a.price5
	when 6 then a.price6
	when 7 then a.price7
	when 8 then a.price8
	when 9 then a.price9
	when 10 then a.price10
end<>0

где тут ошибка?
8 июл 12, 10:42    [12835131]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать гибкое условие where  [new]
Crimean
Member

Откуда:
Сообщений: 13148
cte вам в руки. по крайней мере код станет читаемый
8 июл 12, 17:57    [12835711]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать гибкое условие where  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Нормализуйте базу (в частности таблицу dbo.Article) и тогда не будут у вас никаких CASE-ов. И работать будет нормально без тормазов.

И пишете нормально имена объектов вместе со схемой - всегда.
И зачем вы @PriceStock отдельно запрашиваете? Лишний JOIN жалко?
Используйте VIEW и не нужно будет код повторять по многу раз.
Используйте процедуры для изменения данных, а для получения - в основном функции (параметризованные представления).
8 июл 12, 23:41    [12836435]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить