O banco de dados é o Postgres.
Estou com um problema em que tenho uma tabela com as seguintes colunas: ID, Product_ID Customer_ID, Price e Item_Type.
Esta tabela é unida em Product_ID a outra tabela. Para um determinado ID de produto, há o preço padrão (onde o Customer_ID está em branco) para um determinado tipo de item (Novo, Renovação, Resgate etc.), também pode haver uma lista de preços específica do cliente (onde Customer_ID é unido à Tabela Clientes ).
O problema é que esse banco de dados tem sido mal mantido. Para Item_Type existem 2 Preços que para esta edição nos interessam: Renew e Renewal. Alguns preços têm um preço de renovação, alguns têm um preço de renovação e alguns têm ambos.
select p.id, pr.customer_id, p.period, pr.price, pr.item_type
from products p
right join prices pr on
pr.product_id = p.id and pr.period = p.period and pr.customer_id is null
where p.status = 'PURCHASED'
Como exemplo, isso produz o seguinte:
121751 8407508 12 29.95 RENEW
121751 8407508 12 35.95 RENEWAL
A causa é que este produto tem 2 preços diferentes para Renovação e Renovação - olhando para o código do aplicativo de front-end - se houver um item_type 'RENEWAL', esse preço será usado, caso contrário, o preço 'RENEW' será usado.
Eu tentei usar uma instrução case, tanto na cláusula select quanto na where:
case pr.item_type
when 'RENEWAL' then pr.price
when 'RENEW' then pr.price
end
Mas ainda recebo as duas linhas - não tenho certeza de como fazer uma pesquisa condicional e hierárquica, por exemplo, se a condição A for correspondida, retornar a linha que corresponde à condição A, se nenhuma correspondência for encontrada, a condição B for correspondida e retornar a linha que corresponde à condição B etc.
A condição da tabela left converte seu RIGHT JOIN em INNER JOIN implicitamente.
Use, por exemplo, algo como (levando em consideração o comentário anterior):
SE o preço RENEWAL existir, ele será retornado, caso contrário, mas o preço RENEW existir, você o receberá, caso contrário, obterá NULL (você pode juntar mais cópias da tabela de preços com outros tipos de preço na ordem necessária).