powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Множество условий фильтрации в where
7 сообщений из 7, страница 1 из 1
Множество условий фильтрации в where
    #39925573
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

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

Имеется запрос к нескольким таблицам, в 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
Множество условий фильтрации в where
    #39925576
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql2012,

авторСпасибо за внимание!
пожалуйста
вопрос то где или просто хватстаетесь?
...
Рейтинг: 0 / 0
Множество условий фильтрации в where
    #39925582
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Множество условий фильтрации в where
    #39925587
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Множество условий фильтрации в where
    #39925588
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Множество условий фильтрации в where
    #39925590
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court,

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

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


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