Создание таблицы!
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