Скрипт с IF IF для обновления поля таблицы Oracle - PullRequest
0 голосов
/ 08 января 2019

Мне нужна ваша помощь в создании моего скрипта для обновления поля в моей таблице.

В моем приложении есть люди (таблица PERSON), которые создают REQUESTS (таблица REQUEST). Человек активен, когда он создал запрос в течение последних 3 лет. Я создал поле (ACTIVE - значение по умолчанию: 1) в таблице PERSON, чтобы узнать, активен ли этот человек.

Я создаю запрос для получения количества запросов для каждого человека (активный запрос, неактивный запрос):

select p.ID, p.LASTNAME || ' ' ||  p.FIRSTNAME personName,p.COMPANY, p.ACTIVE,
(SELECT COUNT(*) FROM request req WHERE req.PERSONID = p.ID) AS "NB_REQUEST", 
(SELECT COUNT(*) FROM request reqAct WHERE reqAct.PERSONID = p.ID and reqAct.requestdate > ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), -36)) AS "NB_ACTIVE_REQUESTS", 
(SELECT COUNT(*) FROM request reqInact WHERE reqInact.PERSONID = p.ID and reqInact.requestdate < ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), -36)) AS "NB_INACTIVE_REQUESTS"
from person p

Этот скрипт работает. Теперь я хотел бы реализовать скрипт для обновления поля ACTIVE, когда человек активен. Я впервые попытался реализовать оператор IF, но он не работает.

select p.ID, p.LASTNAME || ' ' ||  p.FIRSTNAME personName,p.COMPANY, p.ACTIVE,
(SELECT COUNT(*) FROM request req WHERE req.PERSONID = p.ID) AS "NB_REQUEST", 
(SELECT COUNT(*) FROM request reqAct WHERE reqAct.PERSONID = p.ID and reqAct.requestdate > ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), -36)) AS "NB_ACTIVE_REQUESTS", 
(SELECT COUNT(*) FROM request reqInact WHERE reqInact.PERSONID = p.ID and reqInact.requestdate < ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), -36)) AS "NB_INACTIVE_REQUESTS"
(IF((SELECT COUNT(*) FROM request reqReAct WHERE reqAct.PERSONID = p.ID and reqReAct.requestdate > ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), -36))) > 0 THEN 1 ELSE 0) AS "RE-ACTIVE" 
from person p

Не могли бы вы помочь мне сделать это?

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Вы можете использовать выражение CASE ... END. Вы также можете попытаться использовать EXISTS вместо подсчета. Это может быть быстрее.

SELECT p.id,
       p.lastname || ' ' ||  p.firstname personname,
       p.company,
       p.active,
       (SELECT count(*)
               FROM request req
               WHERE req.personid = p.id) nb_request,
       (SELECT count(*)
               FROM request reqact
               WHERE reqact.personid = p.id
                     AND reqact.requestdate > add_months(trunc(sysdate, 'YYYY'), -36)) nb_active_requests,
       (SELECT count(*)
               FROM request reqinact
               WHERE reqinact.personid = p.id
                     AND reqinact.requestdate < add_months(trunc(sysdate, 'YYYY'), -36)) nb_inactive_requests,
       CASE
         WHEN EXISTS (SELECT *
                             FROM request reqreact
                             WHERE reqact.personid = p.id
                                   AND reqreact.requestdate > add_months(trunc(sysdate, 'YYYY'), -36)) THEN
           1
         ELSE
           0
       END re_active
       FROM person p;

Альтернативой может быть проприетарное Oracle decode().

Кстати: если посмотреть на оба ваших подзапроса, сравнивающих requestdate, то используются только операторы < и >. Это оставляет пробел для дела =. Возможно, это не было задумано, и вы хотите проверить, использовать ли =< или =< для одного из них.

0 голосов
/ 08 января 2019

Ну, просто замените оператор if условием

select p.ID,
       p.LASTNAME || ' ' || p.FIRSTNAME personName,
       p.COMPANY,
       p.ACTIVE,
       (SELECT COUNT(*) FROM request req WHERE req.PERSONID = p.ID) AS "NB_REQUEST",
       (SELECT COUNT(*)
          FROM request reqAct
         WHERE reqAct.PERSONID = p.ID
           and reqAct.requestdate > ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), -36)) AS "NB_ACTIVE_REQUESTS",
       (SELECT COUNT(*)
          FROM request reqInact
         WHERE reqInact.PERSONID = p.ID
           and reqInact.requestdate <
               ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), -36)) AS "NB_INACTIVE_REQUESTS",
                             case when ( SELECT COUNT(*)
                                                                                         FROM request reqReAct
                                                                                        WHERE reqAct.PERSONID = p.ID
                                                                                          and reqReAct.requestdate >
                                                                                              ADD_MONTHS(TRUNC(SYSDATE,
                                                                                                               'YYYY'),
                                                                                                         -36))) >0 THEN 1 ELSE 0 end ) AS "RE-ACTIVE"


  from person p
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...