Oracle-Как сделать эффект игнорирования условия - PullRequest
0 голосов
/ 04 октября 2019

Функция MY_FUN возвращается должным образом.

SELECT MY_FUN('e1','m1','L1') TEST1 FROM DUAL; --This return value 5 as expected.

TEST1
-----
  5

Функциональными параметрами являются EQUIP, MODEL и LOT. Он выбирает значение в столбце RR в таблице WC_BASE в соответствии с EQUIP, MODEL и ITEM1. И значение ITEM1 находится в таблице M_IF с помощью LOT.

Но, Как изменить MY_FUN для возврата значения, даже если значение ITEM1 равно NULL? Например, LOT 'L3' равен NULL или LOT4 не существует в таблице M_IF.

--How to modify MY_FUN to return 6?  
SELECT MY_FUN('e1','m1','L3') TEST2 FROM DUAL; 
SELECT MY_FUN('e1','m1','L4') TEST3 FROM DUAL;

Ожидаемый результат:

TEST2
------
   6
TEST3
------
   6

[Моя таблица и данные]

CREATE TABLE WC_BASE  (  
  EQUIP VARCHAR2(15),
  MODEL VARCHAR2(15),
  VAL VARCHAR2(15),
  ITEM1 VARCHAR2(15),
  RR VARCHAR2(15)
  );
CREATE TABLE M_IF  (  
  LOT VARCHAR2(15),
  ITEM1 VARCHAR2(15)
  );
 INSERT INTO WC_BASE VALUES('e1','m1','2','c1','5');  
 INSERT INTO WC_BASE VALUES('e1','m1','1',NULL,'6');  
 INSERT INTO M_IF VALUES('L1','c1');  
 INSERT INTO M_IF VALUES('L2','c1');
 INSERT INTO M_IF VALUES('L3',NULL); 

[Моя функция]

CREATE OR REPLACE FUNCTION MY_FUN
(
  P1 IN VARCHAR2,
  P2 IN VARCHAR2, 
  P3 IN VARCHAR2     
 )
 RETURN NUMBER AS V_VALUE NUMBER;
BEGIN
SELECT (
---
WITH SG AS (SELECT * 
FROM WC_BASE
WHERE EQUIP =P1
AND MODEL =P2
AND ITEM1=(SELECT ITEM1 FROM M_IF WHERE LOT = P3) -- How to make an effect of ignoring this condition if the subquery returns null?
) 
SELECT (x1) ANSWER
      FROM ( SELECT 
            NVL(TO_NUMBER(RR),0)  AS x1
            FROM SG
            WHERE VAL IN (SELECT TO_CHAR(MAX(TO_NUMBER(VAL))) FROM SG )
        )
---
)
INTO V_VALUE
FROM DUAL ;
RETURN V_VALUE;
END MY_FUN;
/ 

1 Ответ

0 голосов
/ 04 октября 2019

Вы можете изменить запрос предложения WITH, используя OUTER JOIN.

SELECT W.* 
FROM WC_BASE W
LEFT JOIN M_IF M
ON (W.ITEM1 = M.ITEM1) 
WHERE W.EQUIP =P1
AND W.MODEL =P2
AND M.LOT = P3

Cheers !!

...