Условное предложение WHERE с более чем 3 условиями - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть запрос с условным предложением WHERE, в котором я выбираю пользователей из Таблицы 1 на основе элемента страницы.

Если элемент страницы имеет значение TYPE1 или TYPE2, я выбираю пользователей из Table1, которых нет в Table2, удовлетворяя первому условию, и если пользователь имеет тип TYPE3, то я выбираю пользователей из таблицы 2, которых нет в таблице 2, при втором условии.

Теперь мне нужно добавить еще два типа TYPE4 и TYPE5, но проблема в том, что если пользователи относятся к одному из этих типов, они не должно уже существовать в таблице 2 с status='NEW'

      SELECT 1
      FROM   Table2 b
      WHERE  b.id = a.id            
         AND b.type_id = :P2_TEST_TYPE
         AND b.status = 'NEW'`

но должны быть в ролях «ПЕРВИЧНЫЕ» и «ВТОРИЧНЫЕ» соответственно:

mypackage.get_role(a.id) = 'PRIMARY' AND mypackage.get_type_id(TO_NUMBER(:P2_TEST_TYPE))='TYPE4'

И

mypackage.get_role(a.id) = 'SECONDARY' AND mypackage.get_type_id(TO_NUMBER(:P2_TEST_TYPE))='TYPE5'

Запрос, относящийся к типам TYPE1, TYPE2 и TYPE3, приведен ниже. Как я могу включить условия для TYPE4 и TYPE5 в этот запрос:

SELECT a.ID, a.NAME
FROM Table1 a
WHERE NOT EXISTS
  (SELECT 1
      FROM   Table2 b
      WHERE  b.id = a.id            
         AND b.type_id = :P2_TEST_TYPE
         AND mypackage.get_category_id(b.parent_id) <> mypackage.get_category_id(:P2_PARENT_ID)
         AND b.status = 'NEW'
         AND mypackage.get_type_id(TO_NUMBER(:P2_TEST_TYPE)) IN ('TYPE1', 'TYPE2')
   UNION ALL
   SELECT 1
      FROM   Table2 b
      WHERE  b.id = a.id            
         AND b.type_id = :P2_TEST_TYPE
         AND b.status = 'NEW'
         AND mypackage.get_type_id(TO_NUMBER(:P2_TEST_TYPE)) = 'TYPE3'
  );            

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Решила разделить логику между двумя регионами, а затем использовать show / hide, чтобы отобразить соответствующий регион

0 голосов
/ 19 апреля 2019

В связи с тем, что оба подзапроса очень похожи, я предлагаю вам выделить в один подзапрос все общие условия AND и включить дополнительные OR для каждого альтернативного условия.Затем сгруппируйте каждый набор условий по их общим подусловиям (относящимся к b.status):

SELECT a.ID, a.NAME
FROM Table1 a
WHERE NOT EXISTS
(
    SELECT 1
    FROM   Table2 b
    WHERE  b.id = a.id            
        AND b.type_id = :P2_TEST_TYPE
        AND
        (
            (
                b.status = 'NEW' AND
                (
                    (
                        mypackage.get_type_id(TO_NUMBER(:P2_TEST_TYPE)) IN ('TYPE1', 'TYPE2')
                        AND
                        mypackage.get_category_id(b.parent_id) <> mypackage.get_category_id(:P2_PARENT_ID)
                    )
                    OR (mypackage.get_type_id(TO_NUMBER(:P2_TEST_TYPE)) = 'TYPE3')
                )
            )
            OR 
            (
                b.status <> 'NEW' AND
                (
                       (mypackage.get_role(a.id) = 'PRIMARY' AND mypackage.get_type_id(TO_NUMBER(:P2_TEST_TYPE))='TYPE4')
                    OR (mypackage.get_role(a.id) = 'SECONDARY' AND mypackage.get_type_id(TO_NUMBER(:P2_TEST_TYPE))='TYPE5')
                )
            )
        )
);

Конечно, это создает слишком много сложности.Вместо этого вам следует рассмотреть возможность использования клиентской языковой процедуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...