Sql 如何仅选择满足多个排序条件之一的行
我的客户有多个地址。每个客户/地址组合在数据库Oracle表中都有自己的行 我试图实现一个查询,如果客户有“主地址”,我只显示主地址, 否则,如果他有发货地址,我只显示发货地址, 否则,如果他有“辅助地址”,我会显示辅助地址, 否则我什么也不显示 这个订单很重要,问题是数据库中的条目没有特定的顺序,这意味着同一个客户可能首先有一个发货地址,然后才有一个主地址。因此,我不需要满足其中一个条件的第一行 我尝试了这个方法,但它会为每一行返回一个结果,例如,一个人有多个结果:Sql 如何仅选择满足多个排序条件之一的行,sql,oracle,Sql,Oracle,我的客户有多个地址。每个客户/地址组合在数据库Oracle表中都有自己的行 我试图实现一个查询,如果客户有“主地址”,我只显示主地址, 否则,如果他有发货地址,我只显示发货地址, 否则,如果他有“辅助地址”,我会显示辅助地址, 否则我什么也不显示 这个订单很重要,问题是数据库中的条目没有特定的顺序,这意味着同一个客户可能首先有一个发货地址,然后才有一个主地址。因此,我不需要满足其中一个条件的第一行 我尝试了这个方法,但它会为每一行返回一个结果,例如,一个人有多个结果: CASE WHEN ADR
CASE WHEN ADR = 'MAIN' THEN 'MAIN'
WHEN ADR = 'SHIPMENT' THEN 'SHIPMENT'
WHEN ADR = 'SECONDARY' THEN 'SECONDARY'
ELSE null
END AS Adressart
为了澄清,输入如下所示:
CUSTOMER_NR ADDRESS_TYPE
1 SHIPMENT
1 MAIN
2 SHIPMENT
3 SECONDARY
3 SHIPMENT
4 SECONDARY
结果如下所示:
CUSTOMER_NR ADDRESS_TYPE
1 MAIN
2 SHIPMENT
3 SHIPMENT
4 SECONDARY
我认为可以对地址表使用多个连接,并使用coalesce只返回订单中的一个地址 查询将类似于:
SELECT customer_nr, coalesce(a1.address, a2.address, a3,address) AS address
FROM customer AS c
LEFT JOIN address AS a1 where a1.customer_nr = c.customer_nr and a1.address_type = 'MAIN'
LEFT JOIN address AS a2 where a2.customer_nr = c.customer_nr and a2.address_type = 'SHIPMENT'
LEFT JOIN address AS a3 where a3.customer_nr = c.customer_nr and a3.address_type = 'SECONDARY'
以下查询将获得所需的结果:
SELECT
CUSTOMER_NR,
ADDRESS_TYPE
FROM
(
select
customer_nr,
address_type,
row_number () over (partition by customer_nr order by
case address_type
when 'MAIN' then 1
when 'SHIPMENT' then 2
when 'SECONDARY' THEN 3
else 4
end) rn
from addresses
)
WHERE rn = 1;
首先,使用优先级和CASE语句对地址进行排序。然后,仅选择具有最高优先级的地址类型rn=1的地址类型
您使用的是mysql还是oracle?我使用的是oracle see标记。我也编辑了这篇文章。请不要用MySQL标记oracle问题。谢谢这有关系吗?不完全相关。我不需要一行满足任何一个条件,我需要一行满足特定顺序的条件。a3.地址。。。地址不是a3