Oracle SQL Где условия вес

Создание таблицы!

DROP TABLE mytable;

CREATE TABLE mytable 
(
    product_code VARCHAR2(20 BYTE) NOT NULL ENABLE, 
    priority NUMBER NOT NULL ENABLE, 
    date_act DATE, 
    date_dis DATE
);

заполнить стол

INSERT INTO mytable (product_code, priority, date_act, date_dis) VALUES ('bla', Ɔ', TO_DATE(񟭓-01-01', 'YYYY-MM-DD'), TO_DATE(񟭓-01-31', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority, date_act, date_dis) VALUES ('bla', Ƈ', TO_DATE(񟭓-02-01', 'YYYY-MM-DD'), TO_DATE(񟭓-02-28', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority, date_act) VALUES ('bla', ƈ', TO_DATE(񟭓-01-01', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority, date_act) VALUES ('bla', Ɖ', TO_DATE(񟭓-02-01', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority, date_dis) VALUES ('bla', Ɗ', TO_DATE(񟭓-01-31', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority, date_dis) VALUES ('bla', Ƌ', TO_DATE(񟭓-02-28', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority) VALUES ('bla', ƌ');
INSERT INTO mytable (product_code, priority) VALUES ('bla', ƍ');

введите описание изображения здесь

Теперь мне нужна только одна строка, использующая два входных параметра (или переменные) product_code и date_submit ,

Я использую коннекторы OR, но мне необходимо определить некоторое условие Weight (на самом деле не входит в mytable ) в соответствии со значениями date_act и date_dis .

Если condition_weight 4 равен true левые ( 3 , 2 и 1 ) будут игнорироваться.

Если условный вес 4 равен false а условный вес 3 равен true , условный вес 2 и условный вес 1 будут игнорироваться.

Если condition_weight 4 и 3 имеют значение false а condition_weight 2 равен true condition_weight 1 будет игнорироваться.

Если условие_вес 4, 3 и 2 false условие_вес 1 будет оцениваться.

Ожидаемые результаты ... введите описание изображения здесь

SELECT * FROM mytable 
WHERE product_code = :product_code 
AND (
  TO_DATE (:date_submit, 'yyyy/mm/dd') BETWEEN date_act AND date_dis  --condition_weight 4
  OR (TO_DATE (:date_submit, 'yyyy/mm/dd') <= date_dis AND date_act IS NULL)  --condition_weight 3
  OR (TO_DATE (:date_submit, 'yyyy/mm/dd') >= date_act AND date_dis IS NULL)  --condition_weight 2
  OR (date_dis IS NULL AND date_act IS NULL)  --condition_weight 1
    )
AND ROWNUM <= 1
ORDER BY priority DESC 
; 

Какая-то идея выполнить этот SELECT с требованиями?

Всего 1 ответ


Я проверил вашу таблицу второго изображения, и работает ...

var date_submit varchar2(12);
exec :date_submit := 񟭓/12/31'
var product_code varchar2(12);
exec :product_code := 'bla'


SELECT resp.*, :date_submit FROM (
    SELECT 4 condition_weight, mytable.priority prio, mytable.* FROM mytable 
    WHERE product_code = :product_code 
    AND TO_DATE (:date_submit, 'yyyy/mm/dd') BETWEEN date_act AND date_dis

    UNION

    SELECT 3 condition_weight, mytable.priority prio, mytable.* FROM mytable 
    WHERE product_code = :product_code 
    AND TO_DATE (:date_submit, 'yyyy/mm/dd') <= date_dis AND date_act IS NULL

    UNION

    SELECT 2 condition_weight, mytable.priority prio, mytable.* FROM mytable 
    WHERE product_code = :product_code 
    AND TO_DATE (:date_submit, 'yyyy/mm/dd') >= date_act AND date_dis IS NULL

    UNION

    SELECT 1 condition_weight, mytable.priority prio, mytable.* FROM mytable 
    WHERE product_code = :product_code 
    AND date_dis IS NULL AND date_act IS NULL

    ORDER BY condition_weight DESC, prio DESC   
) resp
WHERE ROWNUM <= 1
;

Выход

2019/01/15

CONDITION_WEIGHT       PRIO PRODUCT_CODE           PRIORITY DATE_ACT  DATE_DIS  :DATE_SUBMIT                                                                                                                    
---------------- ---------- -------------------- ---------- --------- --------- --------------------------------------------------------------------------------------------------------------------------------
               4          0 bla                           0 01-JAN-19 31-JAN-19 2019/01/15     

2019/02/15

CONDITION_WEIGHT       PRIO PRODUCT_CODE           PRIORITY DATE_ACT  DATE_DIS  :DATE_SUBMIT                                                                                                                    
---------------- ---------- -------------------- ---------- --------- --------- --------------------------------------------------------------------------------------------------------------------------------
               4          1 bla                           1 01-FEB-19 28-FEB-19 2019/02/15                                                                                                                      

2018/12/31

CONDITION_WEIGHT       PRIO PRODUCT_CODE           PRIORITY DATE_ACT  DATE_DIS  :DATE_SUBMIT                                                                                                                    
---------------- ---------- -------------------- ---------- --------- --------- --------------------------------------------------------------------------------------------------------------------------------
               3          5 bla                           5           28-FEB-19 2018/12/31                                                                                                                      

2019/12/31

CONDITION_WEIGHT       PRIO PRODUCT_CODE           PRIORITY DATE_ACT  DATE_DIS  :DATE_SUBMIT                                                                                                                    
---------------- ---------- -------------------- ---------- --------- --------- --------------------------------------------------------------------------------------------------------------------------------
               2          3 bla                           3 01-FEB-19           2019/12/31                                                                                                                      

Есть идеи?

10000