:: Не фоксом единым
Запрос к MS SQL
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Собственно есть ХП.
И вот понадобилось к ней добавить параметр, и в зависимости от него либо
...
where
... and id_iface=4
Либо без этой строки.
Не могу сообразить как это сделать.

Про динамический запрос, про if else все ясно.
Может какой то простой синтаксис есть, типа case , но в where ?


------------------
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
declare @MyPar int = 4
create table #test (f1 int)
insert into #test
select 1
union
select 2
union
select 3
union
select 4
select * from #test
where
f1 =
case
when f1 = @MyPar
then 4
end
drop table #test


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Аспид
...
where
... and id_iface=4
C ID хорошо работает такой способ:
where id_face is null or id_face = 4
Цитата:
Может какой то простой синтаксис есть, типа case , но в where ?
Без извращений жизнь не мила...

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Серёг.

Ему надо, что бы при определенном значении параметра в where добавить доп. условие, типа

- без параметра
where ID = @MyID

- а если пришёл параметр, то д.б.
where ID = @MyID and id_face = 4

PS 2Аспид, а чем динамика не нравится, запрос монстрообразный, рекомпиляции боишься?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 14.09.16 17:13
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Ты так думаешь? Хм, может он и такое хочет... Ну может дождемся уточнений.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Извините, подзадержался)
Я прошу прощения, просто сразу сам не докумекал.

Условия должны быть в зависимости от параметра либо
id_face = 4
либо
id_face <> 4
ближе всех
and g.id_iface=
case when @mat = 1
then 4
else
g.id_iface
end

Но неверный результат при @mat=0
Ясно, что попадают и g.id_iface=4

Динамику не хочу... из спорт. интереса)))
Мне легче еще поле (mat) в табл. внести, и проапдейтить по значению g.id_iface=4 и тогда все банально становится)

Вот так вроде как правильно.
and g.id_iface=
case when @mat = 1
then 4
else
g.id_iface
end
and g.id_iface<>
case when @mat = 0
then 4
else
1 --до фонаря что)
end

На тестах верно выдает.
Может что то покрасивше мона. (MS sql 2008)


------------------




Исправлено 1 раз(а). Последнее : Аспид, 14.09.16 20:55
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
pasha_usue

Сообщений: 3647
Откуда: Е-бург
Дата регистрации: 06.10.2006
Условия CASE не всегда оптимизируются по индексу. Поэтому я предпочитаю писать так:
WHERE (@isravno AND g.id_iface=@myparam) OR (NOT @isravno AND g.id_iface<>@myparam)

Но тем не менее, если написать:
WHERE CASE WHEN @isravno THEN g.id_iface=@myparam ELSE g.id_iface<>@myparam END

То оптимизатор должен по-идее это место в зависимости от параметра превратить в g.id_iface=@myparam или g.id_iface<>@myparam.
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
pasha_usue

Сообщений: 3647
Откуда: Е-бург
Дата регистрации: 06.10.2006
Аспид
Вот так вроде как правильно.
and g.id_iface=
case when @mat = 1
then 4
else
g.id_iface
end
and g.id_iface<>
case when @mat = 0
then 4
else
1 --до фонаря что)
end

А вот с этой лесенкой, боюсь, оптимизатор не справится. Но не утверждаю. Надо проверять, подхватывается индекс в этой конструкции, или нет. И каким алгоритмом подхватывается индекс. Это тоже важно.
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Спасибо)
and ((@mat=0 and g.id_iface =4) or (@mat=1 and g.id_iface <>4))
Коротко и понятно)


------------------
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
pasha_usue
Но тем не менее, если написать:
WHERE CASE WHEN @isravno THEN g.id_iface=@myparam ELSE g.id_iface<>@myparam END

То оптимизатор должен по-идее это место в зависимости от параметра превратить в g.id_iface=@myparam или g.id_iface<>@myparam.
То до оптимизатора дело не дойдет. Ибо в T-SQL нет логического типа и функция case не может вернуть результат такого типа.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
ssa
...То до оптимизатора дело не дойдет. Ибо в T-SQL нет логического типа и функция case не может вернуть результат такого типа.

Мне вот тоже не понятно, почему для такого случая не использовать динамику, ведь выигрыш очевиден: это рекомпиляция "строки", как "+" прослушивание параметра и получение оптимального плана.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/1 positive
Re: Запрос к MS SQL
pasha_usue

Сообщений: 3647
Откуда: Е-бург
Дата регистрации: 06.10.2006
ssa
pasha_usue
Но тем не менее, если написать:
WHERE CASE WHEN @isravno THEN g.id_iface=@myparam ELSE g.id_iface<>@myparam END

То оптимизатор должен по-идее это место в зависимости от параметра превратить в g.id_iface=@myparam или g.id_iface<>@myparam.
То до оптимизатора дело не дойдет. Ибо в T-SQL нет логического типа и функция case не может вернуть результат такого типа.
Я забываю периодически нюансы разных диалектов SQL. Поэтому, спасибо, что поправили. Но репрокод топикстартер понял, насколько я могу судить.
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
pasha_usue

Сообщений: 3647
Откуда: Е-бург
Дата регистрации: 06.10.2006
PaulWist
ssa
...То до оптимизатора дело не дойдет. Ибо в T-SQL нет логического типа и функция case не может вернуть результат такого типа.

Мне вот тоже не понятно, почему для такого случая не использовать динамику, ведь выигрыш очевиден: это рекомпиляция "строки", как "+" прослушивание параметра и получение оптимального плана.
Выигрыш перед динамическими запросами будет, если бомбить сервак кучей однотипных запросов. Тогда не будет каждый раз тратиться время на компиляцию и поиск плана запроса.
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
pasha_usue
Выигрыш перед динамическими запросами будет, если бомбить сервак кучей однотипных запросов. Тогда не будет каждый раз тратиться время на компиляцию и поиск плана запроса.

Если бы у ТС были бы однотипные запросы он бы не пытался поставить условие в where.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Там именно идет получение на клиента некоего списка.
Потом клиент, заполняет по нему детали.
Потому именно бомбит сервак таким запросом, но с разными условиями.


------------------
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Аспид
Там именно идет получение на клиента некоего списка.
Потом клиент, заполняет по нему детали.
Потому именно бомбит сервак таким запросом, но с разными условиями.

Обычно в таких случаях делается так:

- заполняется временная/постоянная табличка данными из клиентского списка
- в ХП выполняется запрос вида
select * from ИзЦелевойТаблы where ID_Детали in (select ID_Детали from временная/постоянная табличка)


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
PaulWist
Обычно в таких случаях делается так: ...
Что то не ясен смысл!
И задача, не выбрать из таблицы деталей, а именно создать эти детали.
Т.е. есть список заказчик+договор.
Есть по нему 2 типа отгрузки (во с ними то и была заковыка, в других местах это деление не нужно) и услуги.
Все в одной таблице (условно) (Там как раз, типичный мастер-детали)
Вот по каждому и выбирается.


------------------




Исправлено 1 раз(а). Последнее : Аспид, 16.09.16 08:34
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Аспид
PaulWist
Обычно в таких случаях делается так: ...
Что то не ясен смысл!
И задача, не выбрать из таблицы деталей, а именно создать эти детали.
Т.е. есть список заказчик+договор.
Есть по нему 2 типа отгрузки (во с ними то и была заковыка, в других местах это деление не нужно) и услуги.
Все в одной таблице (условно) (Там как раз, типичный мастер-детали)
Вот по каждому и выбирается.

Дык, тут принцип одинаков (независимо от того, что надо сделать: выбрать, обновить, удалить)
на сервак в промежуточную табличку заливаешь данные с клиента (причем в этой табличке можно нафигачить сколько хочешь условий), затем вызываешь ХП, которая знает про эту табличку и уже работает с ней (select, insert, update, delete/merge)


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
PaulWistпонял твою мысль)))

Не... на серваке мне все это не надо. Там и так все складно.
Мне это тока на клиент надо.


------------------
Ratings: 0 negative/0 positive
Re: Запрос к MS SQL
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Тогда на клиенте и держать 2 разных, но простых запроса (без выкаблучиваний с параметром-отключетелем/переключателем условий).


------------------
WBR, Igor
Ratings: 0 negative/1 positive


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

On-line: 12 (Гостей: 12)

© 2000-2024 Fox Club 
Яндекс.Метрика