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

Откуда:
Сообщений: 31
Всем доброго дня!

Есть такой запрос

SELECT * FROM Product WHERE IsDelete=0

или
SELECT * FROM Product WHERE MerchantId=5 AND Name='Test'


который возвращает результат согласно условию.


Есть ли такая переменная или константа в MsSql, чтобы при выполнении этих запросов:

SELECT * FROM Product WHERE IsDelete={HACK}

или
SELECT * FROM Product WHERE MerchantId={HACK} AND Name={HACK}


условия WHERE игнорировалось бы там, где в значении стояла бы это константа?

Заранее спасибо!
22 июл 15, 11:23    [17920410]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
Glory
Member

Откуда:
Сообщений: 104751
LexNext
Есть ли такая переменная или константа в MsSql, чтобы при выполнении этих запросов:

SELECT * FROM Product WHERE IsDelete={HACK}


или
SELECT * FROM Product WHERE MerchantId={HACK} AND Name={HACK}



условия WHERE игнорировалось бы там, где в значении стояла бы это константа?

Для того, чтобы сервер что то игнорировал, просто не пишите это в тексте запроса
22 июл 15, 11:28    [17920432]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
LexNext
условия WHERE игнорировалось бы
Если выражение в WHERE возвращает истину, то строка попадает в результирующий датасет,
иначе - не попадает.
СлабО написать правильное логическое выражение в WHERE?
22 июл 15, 11:33    [17920461]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
LexNext, шта?

Из вашего сбивчивого объяснения, я понял, что при определенном значении переменной нужно не учитывать фильтр по полю. Так? Если да, то это так делается:

declare @MerchantId int;

--при значении @MerchantId не учитываем фильтр по этому полю
set @MerchantId = 0;

SELECT * FROM Product WHERE (@MerchantId = 0 or MerchantId=@MerchantId)
22 июл 15, 12:48    [17920889]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
LexNext
Member

Откуда:
Сообщений: 31
Minamoto, спасибо большое! это и требовалось!

За описание сорри.
Спасибо за помощь.
22 июл 15, 13:26    [17921111]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
SELECT * FROM Product WHERE MerchantId=(case when @MerchantId<>0 then @MerchantId else MerchantId end)
23 июл 15, 11:08    [17924724]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SELECT * FROM Product WHERE MerchantId=ALL(SELECT @MerchantId WHERE @MerchantId<>0);
23 июл 15, 11:22    [17924821]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Денис Б.,

не будет работать если поле NULL
23 июл 15, 11:32    [17924904]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
iap, репро:

create table Product (ProdictID int primary key clustered, MerchantID int);

create index product_merchantID on Product(MerchantID);

insert into Product values (1, 1), (2, 1), (3, 2), (4, null);

insert into Product
select n.number + n1.number*10000, 1 
from master..spt_values n
	 inner join master..spt_values n1
				on n1.type = 'P'
where n.type = 'P' and n.number > 4;
go
set showplan_xml on;
go

declare @MerchantID int = 2;

SELECT * FROM Product WHERE (@MerchantId = 0 or MerchantId=@MerchantId);

SELECT * FROM Product WHERE MerchantId=ALL(SELECT @MerchantId WHERE @MerchantId<>0);

go
set showplan_xml off;
go

drop table Product;


Время выполнения:


(строк обработано: 1)

SQL Server Execution Times:
CPU time = 1048 ms, elapsed time = 276 ms.

(строк обработано: 1)

SQL Server Execution Times:
CPU time = 1561 ms, elapsed time = 406 ms.

Есть ли случаи, в которых второй вариант предпочтительнее будет?

К сообщению приложен файл. Размер - 37Kb
23 июл 15, 11:58    [17925048]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Minamoto
Есть ли случаи, в которых второй вариант предпочтительнее будет?
Ну, применять-то этот способ никто не заставляет.
Просто можно и так, вот и всё.
23 июл 15, 12:01    [17925061]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
iap
Minamoto
Есть ли случаи, в которых второй вариант предпочтительнее будет?
Ну, применять-то этот способ никто не заставляет.
Просто можно и так, вот и всё.

Да это понятно, я просто не знал о таком, поэтому решил сравнить эффективность.
23 июл 15, 12:42    [17925226]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Minamoto
iap
пропущено...
Ну, применять-то этот способ никто не заставляет.
Просто можно и так, вот и всё.

Да это понятно, я просто не знал о таком, поэтому решил сравнить эффективность.
https://www.sql.ru/forum/471828/all-gluk-ili-ficha
23 июл 15, 12:52    [17925264]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
например, такая конструкция:
приходит параметр фильтра в трёх вариантах и в условии пишется совершенно дикий case с гарантированным сканом таблицы и никакой производительностью

@ФильтрНаличиеЛимитов tinyint --Все = 0, Только с лимитами = 1, Только без лимитов = 2

...
where
ISNULL(Лимит,0) = (case when @ФильтрНаличиеЛимитов = 0 then ISNULL(Лимит,0) else (case when @ФильтрНаличиеЛимитов = 1 then Лимит else 0 end)  end)
23 июл 15, 13:02    [17925311]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Денис Б.
например, такая конструкция:
приходит параметр фильтра в трёх вариантах и в условии пишется совершенно дикий case с гарантированным сканом таблицы и никакой производительностью

@ФильтрНаличиеЛимитов tinyint --Все = 0, Только с лимитами = 1, Только без лимитов = 2

...
where
ISNULL(Лимит,0) = (case when @ФильтрНаличиеЛимитов = 0 then ISNULL(Лимит,0) else (case when @ФильтрНаличиеЛимитов = 1 then Лимит else 0 end)  end)
Не понятно что вы хотели этим показать? То что умеете писать кривые запросы с плохой производительностью?
24 июл 15, 01:14    [17928077]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Денис Б.,

в этом случае пишется так:

....
where
		 @Is = 0
or		(@Is = 1 and Limit = 1)
or		(@Is = 2 and Limit = 0) 
..............................
or		(@Is = 100500 and ColumnX = 'Y') 
24 июл 15, 06:18    [17928232]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли такой хак в MsSql?  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Или так, если сам запрос не большой.
select * from Table_X where @Is = 0
union all
select * from Table_X where @Is = 1 and Limit = 1
union all
select * from Table_X where @Is = 2 and Limit = 0
union all
..............................
union all
select * from Table_X where  @Is = 100500 and ColumnX = 'Y'


или если условие касается только 1 - 2 табличек - то сделать подзапрос, а на него уже потом наворачивать.
24 июл 15, 06:22    [17928238]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить