Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Множество условий фильтрации в where / 7 сообщений из 7, страница 1 из 1
12.02.2020, 12:23
    #39925573
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Множество условий фильтрации в where
Здравствуйте.

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

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

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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 - известен и не рассматривается.

Спасибо за внимание!
...
Рейтинг: 0 / 0
12.02.2020, 12:28
    #39925576
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Множество условий фильтрации в where
sql2012,

авторСпасибо за внимание!
пожалуйста
вопрос то где или просто хватстаетесь?
...
Рейтинг: 0 / 0
12.02.2020, 12:39
    #39925582
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Множество условий фильтрации в where
TaPaK
sql2012,

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

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

и чем же?

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

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


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
условие с участниками переписал так:

 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))
	     )
...
Рейтинг: 0 / 0
12.02.2020, 12:44
    #39925587
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Множество условий фильтрации в where
sql2012

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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 вынести
...
Рейтинг: 0 / 0
12.02.2020, 12:45
    #39925588
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Множество условий фильтрации в where
sql2012,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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 страшное условие
-- и т.д. и т.п.
...
Рейтинг: 0 / 0
12.02.2020, 12:46
    #39925590
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Множество условий фильтрации в where
court,

Если так сделать, то могут и уволить.
А сейчас фиг кто разберет эту лапшу.
...
Рейтинг: 0 / 0
12.02.2020, 17:12
    #39925878
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Множество условий фильтрации в where
court,

Быстрые запросы -- это часто длинные запросы.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Множество условий фильтрации в where / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]