Как заменить запрос pl / sql на 2 предложения WHERE - PullRequest
0 голосов
/ 10 июля 2020

У меня есть запрос PL / SQL, у которого есть 2 разных предложения WHERE (WHERE(1), WHERE(2)) для одной интерактивной сетки, и у меня есть параметр, если параметр имеет значение 1, тогда запрос PL / SQL будет запустить с WHERE(1), еще параметр имеет значение 2, затем запрос PL / SQL запускается с WHERE(2), надеюсь, кто-то может решить мою проблему, большое спасибо. Это мой запрос PL / SQL:

if :P140101101_CHANGE = 1 then
select T.RDE_ID,
          T.RDE_SIP,
          T.V_IIT_CODE,
          T.V_IIT_NAME
from V_REQUISITION_DETAILS_V6 T
WHERE (T.REQ_ID = :P140101101_V_REQ_ID)

if :P140101101_CHANGE = 2 then
SELECT T.RDE_ID,
       T.RDE_SIP,
       T.V_IIT_CODE,
       T.V_IIT_NAME
  FROM V_REQUISITION_DETAILS_V6 T
 WHERE (T.REQ_ID = ::P140101101_V_REQ_ID) 
   AND EXISTS (SELECT 1
          FROM V_PRICE_LIST_LINES_PO32 PRI
         WHERE PRI.Iit_Id = T.Iit_Id)
   and (T.PLL_ID IS NULL)

Ответы [ 3 ]

0 голосов
/ 10 июля 2020

Вы можете использовать условие OR следующим образом:

SELECT T.RDE_ID,
       T.RDE_SIP,
       T.V_IIT_CODE,
       T.V_IIT_NAME
  FROM V_REQUISITION_DETAILS_V6 T
 WHERE (T.REQ_ID = :P140101101_V_REQ_ID) 
   AND ( :P140101101_V_REQ_ID <> 2 OR (EXISTS (SELECT 1
          FROM V_PRICE_LIST_LINES_PO32 PRI
         WHERE PRI.Iit_Id = T.Iit_Id)
   and (T.PLL_ID IS NULL)))

Обновление : для 4 условий

SELECT T.RDE_ID,
       T.RDE_SIP,
       T.V_IIT_CODE,
       T.V_IIT_NAME
  FROM V_REQUISITION_DETAILS_V6 T
 WHERE (T.REQ_ID = :P140101101_V_REQ_ID) 
-- condition for 1 is irrelevant here  
-- AND ( :P140101101_SREACH_PRICE <> 1 OR (T.REQ_ID = :P140101101_V_REQ_ID))
   AND ( :P140101101_SREACH_PRICE <> 2 OR (EXISTS (SELECT 1
                                                    FROM V_PRICE_LIST_LINES_PO32 PRI
                                                     WHERE PRI.Iit_Id = T.Iit_Id)
                                                     and (T.PLL_ID IS NULL)))
   AND ( :P140101101_SREACH_PRICE <> 3 OR (NOT EXISTS (SELECT 1
                                                       FROM V_PRICE_LIST_LINES_PO32 PRI
                                                       WHERE PRI.Iit_Id = T.Iit_Id))) 
   AND ( :P140101101_SREACH_PRICE <> 4 OR (T.PLL_ID IS NOT NULL)) 
0 голосов
/ 10 июля 2020

Это 4 условия: @ Teja sh

SELECT T.RDE_ID,
       T.RDE_SIP,
       T.V_IIT_CODE,
       T.V_IIT_NAME
  FROM V_REQUISITION_DETAILS_V6 T
 WHERE (T.REQ_ID = :P140101101_V_REQ_ID) 
   AND ( :P140101101_SREACH_PRICE <> 1 OR (T.REQ_ID = :P140101101_V_REQ_ID))
   AND ( :P140101101_SREACH_PRICE <> 2 OR (EXISTS (SELECT 1
                                                    FROM V_PRICE_LIST_LINES_PO32 PRI
                                                     WHERE PRI.Iit_Id = T.Iit_Id)
                                                     and (T.PLL_ID IS NULL)))
   AND ( :P140101101_SREACH_PRICE <> 3 OR (NOT EXISTS (SELECT 1
                                                       FROM V_PRICE_LIST_LINES_PO32 PRI
                                                       WHERE PRI.Iit_Id = T.Iit_Id))) 
   AND ( :P140101101_SREACH_PRICE <> 4 OR (T.PLL_ID IS NOT NULL))                        
0 голосов
/ 10 июля 2020

Самый простой способ сделать это - разбить его на 2 области интерактивной сетки. И в каждой сетке в разделе условий на стороне сервера выберите тип Item = Value и примените условие :P140101101_CHANGE = 1 или 2 соответственно

Еще один способ - использовать Union (я не тестировал этот, но он должно работать)

select T.RDE_ID,
          T.RDE_SIP,
          T.V_IIT_CODE,
          T.V_IIT_NAME
from V_REQUISITION_DETAILS_V6 T
WHERE (T.REQ_ID = :P140101101_V_REQ_ID)
AND :P140101101_CHANGE = 1

UNION

SELECT T.RDE_ID,
       T.RDE_SIP,
       T.V_IIT_CODE,
       T.V_IIT_NAME
  FROM V_REQUISITION_DETAILS_V6 T
 WHERE (T.REQ_ID = ::P140101101_V_REQ_ID) 
   AND EXISTS (SELECT 1
          FROM V_PRICE_LIST_LINES_PO32 PRI
         WHERE PRI.Iit_Id = T.Iit_Id)
   AND (T.PLL_ID IS NULL)
   AND :P140101101_CHANGE = 2
...