Oracle APEX - динамическое предложение where, основанное на элементе страницы - PullRequest
1 голос
/ 18 апреля 2019

Есть ли способ построить динамическое предложение where на основе значения элемента страницы?

Возможно, что-то с использованием CASE WHEN?

SELECT a.ID, a.NAME
FROM Table1 a
WHERE 
    CASE WHEN mypackage.get_type_id(TO_NUMBER(:P2_TEST_TYPE))='TYPE1' OR 
           mypackage.get_type_id(TO_NUMBER(:P2_TEST_TYPE))='TYPE2' THEN
        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'
       )
  WHEN mypackage.get_type_id(TO_NUMBER(:P2_TEST_TYPE))='TYPE3' THEN
       NOT EXISTS (
          SELECT 1
          FROM   Table2 b
          WHERE  b.id = a.id            
             AND  b.type_id = :P2_TEST_TYPE
             AND b.status = 'NEW'
       )
 END 

Как я мог сделать что-то подобное?

1 Ответ

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

Что-то вроде этого, возможно?

Вместо CASE используйте объединение обоих операторов SELECT, но у каждого из них есть свое (дополнительное) условие - то, которое вы намеревались поместить в CASE.

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'
  );            
...