У меня есть курсор, который выбирает адрес для переданного идентификатора, основываясь на последней дате активности.
CURSOR get_address_upd_c (
id t1.id%TYPE
) IS
SELECT street_line1,
street_line2,
city,
stat_code,
zip,
activity_date,
atyp_code
FROM addr
WHERE addr_im = '1'
AND status_ind IS NULL
AND from_date < SYSDATE
AND DECODE (TO_DATE, NULL, SYSDATE, TO_DATE) >= SYSDATE
ORDER BY activity_date DESC;
Существуют определенные идентификаторы, которые имеют более 1 адреса для даты на основе кода atyp. Мой запрос должен получить адрес для определенного кода atyp ('AB'), если этот идентификатор не имеет адреса этого типа AB, тогда я должен получить адрес для другого кода atype, такого как 'SP'.
Я пытался отфильтровать мой вышеупомянутый результат курсора как операторы декодирования, но потерпеть неудачу, когда у моего идентификатора есть больше чем 1 код atyp.
Попытка ниже в предложении IN
SELECT DECODE (
DECODE (
(SELECT atyp_code
FROM addr a2
WHERE a2.id = '1' AND a2.status_ind IS NULL
AND (TRUNC (SYSDATE) BETWEEN TRUNC(NVL (
a2.from_date,
NVL (
a2.TO_DATE,
SYSDATE)))
AND TRUNC(NVL (
a2.TO_DATE,
SYSDATE)))
AND a2.atyp_code = 'AB'),
NULL,
(SELECT atyp_code
FROM addr a2
WHERE a2.id = '1' AND a2.status_ind IS NULL
AND (TRUNC (SYSDATE) BETWEEN TRUNC(NVL (
a2.addr_from_date,
NVL (
a2.TO_DATE,
SYSDATE)))
AND TRUNC(NVL (
a2.TO_DATE,
SYSDATE)))
AND a2.atyp_code = 'SP'),
'AB'),
NULL,
(SELECT atyp_code
FROM addr a2
WHERE a2.id = '1' AND a2.status_ind IS NULL
AND (TRUNC (SYSDATE) BETWEEN TRUNC(NVL (
a2.from_date,
NVL (
a2.TO_DATE,
SYSDATE)))
AND TRUNC(NVL (a2.TO_DATE,
SYSDATE)))),
'ar')
AS t
FROM DUAL;
Мой запрос всегда идет к 'ar 'part, хотя у моего идентификатора есть записи типа' SP '
Пример данных:
ID Street_1 City State Type_Code Activity_Date
1 aaa sds MI SM 23-Dec-19
1 bb wew TN IN 23-Dec-19
1 ccc fcvc AR SP 23-Dec-19
1 dd ewe NY SL 23-Dec-19
2 eee fff TX AB 5-Jan-20
3 gg kkk TX SM 19-Sep-18
O / p должно быть таким же, как показано ниже, на основе значений кода типа.
ID Street_1 City State Type_Code Activity_Date
1 ccc fcvc AR SP 23-Dec-19
2 eee fff TX AB 5-Jan-20
3 gg kkk TX SM 19-Sep-18
Создание и вставка сценариев для примера выше
CREATE TABLE addr (
id NUMBER(8, 0),
street_1 VARCHAR2(100),
city VARCHAR2(100),
state VARCHAR2(5),
type_code VARCHAR2(10),
activity_date DATE,
status_ind VARCHAR2(5),
addr_from_date DATE,
addr_to_date DATE
);
INSERT INTO addr (id,street_1,city,state,type_code,activity_date,status_ind,addr_from_date,addr_to_date) values(1,'aaa','sds','MI','SM','23-DEC-19',NULL,'01-SEP-15',NULL);
INSERT INTO addr (id,street_1,city,state,type_code,activity_date,status_ind,addr_from_date,addr_to_date) values(1,'bb','wew','TN','IN','23-DEC-19',NULL,'01-JUN-18',NULL);
INSERT INTO addr (id,street_1,city,state,type_code,activity_date,status_ind,addr_from_date,addr_to_date) values(1,'ccc','fcvc','AR','SP','23-DEC-19',NULL,'01-SEP-15',NULL);
INSERT INTO addr (id,street_1,city,state,type_code,activity_date,status_ind,addr_from_date,addr_to_date) values(1,'dd','ewe','NY','SL','23-DEC-19',NULL,'01-SEP-18',NULL);
INSERT INTO addr (id,street_1,city,state,type_code,activity_date,status_ind,addr_from_date,addr_to_date) values(2,'ee','fff','TX','AB','05-JAN-20',NULL,'01-MAY-17',NULL);
INSERT INTO addr (id,street_1,city,state,type_code,activity_date,status_ind,addr_from_date,addr_to_date) values(3,'gg','kkk','TX','SM','19-SEP-18',NULL,'23-JUL-15',NULL);
INSERT INTO addr (id,street_1,city,state,type_code,activity_date,status_ind,addr_from_date,addr_to_date) values(4,'aaa','sds','MI','PA','03-NOV-19',NULL,'01-MAR-15',NULL);
INSERT INTO addr (id,street_1,city,state,type_code,activity_date,status_ind,addr_from_date,addr_to_date) values(4,'lll','mno','LA','PB','03-NOV-19',NULL,'01-SEP-15',NULL);
INSERT INTO addr (id,street_1,city,state,type_code,activity_date,status_ind,addr_from_date,addr_to_date) values(4,'jjj','pqr','LA','SP','03-NOV-19',NULL,'01-SEP-15',NULL);
INSERT INTO addr (id,street_1,city,state,type_code,activity_date,status_ind,addr_from_date,addr_to_date) values(5,'mmm','dee','NY','SM','03-MAR-19',NULL,'10-SEP-15',NULL);
INSERT INTO addr (id,street_1,city,state,type_code,activity_date,status_ind,addr_from_date,addr_to_date) values(5,'ppp','aru','TX','SP','03-DEC-17',NULL,'01-SEP-15',NULL);