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

Откуда: РФ
Сообщений: 748
Здравствуйте.

Прошу подсказать выход из ситуации, если он есть...

Имеется запрос к нескольким таблицам, в where необходимо учитывать несколько условий фильтрации, в зависимости от того, указано ли условие фильтрации или нет.

@IdOrg - идентификатор организации, если не указан - выводить записи от всех организаций
@ForMe - если не указан - выводить все, если = 1 - входящие, =2 - исходящие
@IdUser - идентификатор пользователя

TDocs - документы
TOrg - организации (алиасы - RO = recipient org, AO = author org)

select необходимые поля
from TDocs D, TOrg RO, TOrg AO
  where   
	 (@IdOrg>0 -- если был указан идентификатор организации
	 and  D.dt_send between @dt1 and @dt2  -- период
	 and ((AO.id_org=@IdOrg and D.id_recipient=@IdUser ) or (D.id_author=@IdUser and RO.id_org=@IdOrg)) 
	 and RO.id_org=D.id_organization_recipient
	 and AO.id_org=D.id_organization_author
	 
	  and ( если указали только входящие? или только исходящие? или все ....
	       (@ForMe=1 and D.id_recipient=@IdUser) or (@ForMe=2 and D.id_author=@IdUser)
		    т.е. продолжаю по аналогии .. ??
		  ) 
	 )
	 or
	 (
	 @IdOrg=0   -- если необходимо от всех организаций..
	 and
	 D.dt_send between @dt1 and @dt2
	 and (D.id_recipient=@IdUser or D.id_author=@IdUser)
	 and RO.id_org=D.id_organization_recipient
	 and AO.id_org=D.id_organization_author)
	 
	 and (
	       (@ForMe  ... 
  
		  ) 


Итого:
на каждый вариант под @IdOrg, @ForMe и "новые" - необходимо написать 2 блока (true\false + внутри условия дублировать)
и чем больше параметров - тем больше "блоков" вложенных в условия.

p.s. вариант с динамическим формированием SQL - известен и не рассматривается.

Спасибо за внимание!

Сообщение было отредактировано: 12 фев 20, 12:25
12 фев 20, 12:23    [22078142]     Ответить | Цитировать Сообщить модератору
 Re: Множество условий фильтрации в where  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6789
sql2012,

автор
Спасибо за внимание!

пожалуйста
вопрос то где или просто хватстаетесь?
12 фев 20, 12:28    [22078148]     Ответить | Цитировать Сообщить модератору
 Re: Множество условий фильтрации в where  [new]
sql2012
Member

Откуда: РФ
Сообщений: 748
TaPaK
sql2012,

автор
Спасибо за внимание!

пожалуйста
вопрос то где или просто хватстаетесь?


и чем же?

Вопросы внутри - в SQL коде.

Нашел выход, решил проблему.


условие с участниками переписал так:

 and 
	   (
	               (@ForMe=1 and D.id_recipient=@IdUser)
		   or (@ForMe=2 and D.id_author=@IdUser)
		   or (@ForMe=0 and (D.id_recipient=@IdUser or D.id_author=@IdUser))
	     )
12 фев 20, 12:39    [22078164]     Ответить | Цитировать Сообщить модератору
 Re: Множество условий фильтрации в where  [new]
court
Member

Откуда:
Сообщений: 1932
sql2012

select необходимые поля
from TDocs D, TOrg RO, TOrg AO
  where   
	 (@IdOrg>0 -- если был указан идентификатор организации
	 and  D.dt_send between @dt1 and @dt2  -- период
	 and ((AO.id_org=@IdOrg and D.id_recipient=@IdUser ) or (D.id_author=@IdUser and RO.id_org=@IdOrg)) 
	 and RO.id_org=D.id_organization_recipient
	 and AO.id_org=D.id_organization_author
	 
	  and ( если указали только входящие? или только исходящие? или все ....
	       (@ForMe=1 and D.id_recipient=@IdUser) or (@ForMe=2 and D.id_author=@IdUser)
		    т.е. продолжаю по аналогии .. ??
		  ) 
	 )
	 or
	 (
	 @IdOrg=0   -- если необходимо от всех организаций..
	 and
	 D.dt_send between @dt1 and @dt2
	 and (D.id_recipient=@IdUser or D.id_author=@IdUser)
	 and RO.id_org=D.id_organization_recipient
	 and AO.id_org=D.id_organization_author)
	 
	 and (
	       (@ForMe  ... 
  
		  ) 


Для начала, стоило бы эти условия в JOIN вынести
12 фев 20, 12:44    [22078171]     Ответить | Цитировать Сообщить модератору
 Re: Множество условий фильтрации в where  [new]
entrypoint
Member

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

DECLARE @i     INT = 1
      , @IdOrg INT = 10
      , @ForMe INT = 100;

-- Тестовые данные
DECLARE @t AS TABLE(val INT NOT NULL);
WHILE @i < 1000
    BEGIN
        INSERT INTO @t(val) VALUES(@i);
        SET @i+=1;
    END; 

-- Решение
SELECT val FROM @t WHERE val BETWEEN @IdOrg AND @ForMe		-- Первое страшное условие
UNION   
SELECT val FROM @t WHERE val = @ForMe    			-- Второе страшное условие
UNION
SELECT val FROM @t WHERE val < @IdOrg			        -- Третье страшное условие
UNION
SELECT val FROM @t WHERE val IN (@IdOrg, @ForMe ,30 ,40)	-- Четвертое страшное условие
UNION
SELECT val FROM @t WHERE SIGN(@IdOrg) = 0			-- Пятоe страшное условие
-- и т.д. и т.п.
12 фев 20, 12:45    [22078173]     Ответить | Цитировать Сообщить модератору
 Re: Множество условий фильтрации в where  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33125
Блог
court,

Если так сделать, то могут и уволить.
А сейчас фиг кто разберет эту лапшу.
12 фев 20, 12:46    [22078175]     Ответить | Цитировать Сообщить модератору
 Re: Множество условий фильтрации в where  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4309
court,

Быстрые запросы -- это часто длинные запросы.
12 фев 20, 17:12    [22078585]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить