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

Откуда: Санкт-Петербург
Сообщений: 512
Добрый день!
Воспрос наипростейший, но хотелось бы иметь обоснованное понимание использовать ли case в where или использовать иную форму.

пример без case:
SELECT
TOP 1
*
FROM tblTest
WHERE
		(@idRole<2 and ((r.id_owner=@idUser) or (r.id_ownershop=@idUserShop))) 
		or
		(@idRole=2 and r.id_owner=r.id_owner)


C Case
SELECT
TOP 1
*
FROM tblTest
WHERE
	r.id_owner= case
					when @idRole<2 then @idUser
					else r.id_owner
				end
	r.id_ownershop= case
						when @idRole<2 then @idUserShop
						else r.id_ownershop
					end


Как правильно и по фэншую? :)

Спасибо :)
1 июл 19, 12:01    [21918025]     Ответить | Цитировать Сообщить модератору
 Re: Case или не Case, как лучше?  [new]
Владислав Колосов
Member

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

смотрите на план запроса.
1 июл 19, 12:29    [21918048]     Ответить | Цитировать Сообщить модератору
 Re: Case или не Case, как лучше?  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 512
Владислав Колосов,

Понедельник день тяжелый после активных выходных :)

Спасибо, разобрался. В данном примере case лучше.
1 июл 19, 13:04    [21918078]     Ответить | Цитировать Сообщить модератору
 Re: Case или не Case, как лучше?  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Лучше всего UNION
1 июл 19, 13:38    [21918111]     Ответить | Цитировать Сообщить модератору
 Re: Case или не Case, как лучше?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3708
Kast2K
Владислав Колосов,

Понедельник день тяжелый после активных выходных :)

Спасибо, разобрался. В данном примере case лучше.


Вы не определили значение слова "лучше", что это?
1 июл 19, 14:20    [21918161]     Ответить | Цитировать Сообщить модератору
 Re: Case или не Case, как лучше?  [new]
msLex
Member

Откуда:
Сообщений: 8091
Kast2K
SELECT
TOP 1
*
FROM tblTest
WHERE
		(@idRole<2 and ((r.id_owner=@idUser) or (r.id_ownershop=@idUserShop))) 
		or
		(@idRole=2 and r.id_owner=r.id_owner)



Тут точно нет ошибки?

При @idRole=2 у вас предикат поиска "сворачивается" до
r.id_owner=r.id_owner

если id_owner not null, то он верен для всех записей
1 июл 19, 14:58    [21918223]     Ответить | Цитировать Сообщить модератору
 Re: Case или не Case, как лучше?  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 512
msLex,

Если я мои знания верны, то при такой записи
@idRole=2 and r.id_owner=r.id_owner

я получаю абсолютно все записи, ошибки нет. r.id_owner not null
1 июл 19, 15:30    [21918269]     Ответить | Цитировать Сообщить модератору
 Re: Case или не Case, как лучше?  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Kast2K
msLex,

Если я мои знания верны, то при такой записи
@idRole=2 and r.id_owner=r.id_owner

я получаю абсолютно все записи, ошибки нет. r.id_owner not null
Тогда там достаточно оставить @idRole=2
1 июл 19, 16:11    [21918310]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить