postgres внутреннее соединение на основе if else statemnet - PullRequest
0 голосов
/ 31 марта 2020

У меня возникла ситуация, в которой, если флаг имеет значение true, тогда внутреннее соединение с таблицей, иначе соединение не требуется.

SELECT     ti.upc, 
              ti.quantity, 
              ti.return_type, 
              ti.amount, 
              ti.transaction_date, 
              ti.transaction_time, 
              ti.location_id
   FROM       transaction_item ti 
   IF _user = true THEN
   INNER JOIN user_location ul 
   ON         ul.location_id=ti.location_id 
   AND      ul.user_id=_user_id 
   AND        ul.location_id=_location_id
   END IF; 
   WHERE        ti.transaction_date BETWEEN _start_date::date AND  _end_date::date
   AND        ti.upc IS NOT NULL as ti

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Вы не используете никаких данных из user_location, поэтому я бы порекомендовал:

SELECT ti.upc, ti.quantity, ti.return_type,  ti.amount, 
       ti.transaction_date, ti.transaction_time, ti.location_id
FROM ransaction_item ti 
WHERE (_user <> true OR
       EXISTS (SELECT 1
               FROM user_location ul 
               WHERE ul.location_id = ti.location_id AND
                     ul.user_id = _user_id AND
                     ul.location_id = _location_id
              )
      ) AND
      ti.transaction_date BETWEEN _start_date::date AND _end_date::date AND
      ti.upc IS NOT NULL;

Мне кажется, что "условное соединение" трудно следовать. Однако условные фильтры в предложении WHERE довольно просты для отслеживания.

1 голос
/ 31 марта 2020

Вы можете изменить inner join на left join и добавить проверку переменной в условия on. Затем предложение where может отфильтровывать строки, для которых соединение должно было произойти, но не удалось:

SELECT     
    ti.upc, 
    ti.quantity, 
    ti.return_type, 
    ti.amount, 
    ti.transaction_date, 
    ti.transaction_time, 
    ti.location_id
FROM transaction_item ti 
LEFT JOIN user_location ul 
    ON  _user = true
    AND ul.location_id=ti.location_id 
    AND ul.user_id=_user_id 
    AND ul.location_id=_location_id
WHERE    
    ti.transaction_date BETWEEN _start_date::date AND  _end_date::date
    AND ti.upc IS NOT NULL
    AND NOT (_user = true AND ul.location_id IS NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...