Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何仅选择满足多个排序条件之一的行_Sql_Oracle - Fatal编程技术网

Sql 如何仅选择满足多个排序条件之一的行

Sql 如何仅选择满足多个排序条件之一的行,sql,oracle,Sql,Oracle,我的客户有多个地址。每个客户/地址组合在数据库Oracle表中都有自己的行 我试图实现一个查询,如果客户有“主地址”,我只显示主地址, 否则,如果他有发货地址,我只显示发货地址, 否则,如果他有“辅助地址”,我会显示辅助地址, 否则我什么也不显示 这个订单很重要,问题是数据库中的条目没有特定的顺序,这意味着同一个客户可能首先有一个发货地址,然后才有一个主地址。因此,我不需要满足其中一个条件的第一行 我尝试了这个方法,但它会为每一行返回一个结果,例如,一个人有多个结果: CASE WHEN ADR

我的客户有多个地址。每个客户/地址组合在数据库Oracle表中都有自己的行

我试图实现一个查询,如果客户有“主地址”,我只显示主地址, 否则,如果他有发货地址,我只显示发货地址, 否则,如果他有“辅助地址”,我会显示辅助地址, 否则我什么也不显示

这个订单很重要,问题是数据库中的条目没有特定的顺序,这意味着同一个客户可能首先有一个发货地址,然后才有一个主地址。因此,我不需要满足其中一个条件的第一行

我尝试了这个方法,但它会为每一行返回一个结果,例如,一个人有多个结果:

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