如何在oracle数据库上使用case..when

时间:2017-09-06 18:38:54

标签: sql oracle

我在oracle 11g数据库上运行sql语句。输出就像下面的一些连接一样。(还有其他列,但重要的列是这些列)

id | document       | address
---+----------------+--------------
1  | identity_card  | hudson street
1  | driver_licence | hudson street
1  | passport       | hudson street
1  | identity_card  | mike street
1  | driver_licence | mike street
1  | passport       | mike street
2  | driver_licence | laura street
2  | passport       | laura street
3  | passport       | amy street
3  | identity_card  | bug street
3  | identity_card  | apple street
3  | passport       | bug street
4  | driver_licence | 16th street
5  | identity_card  | 21st street

但是我希望它是这样的:

id | document       | address
---+----------------+--------------
1  | identity_card  | hudson street
1  | identity_card  | mike street
2  | passport       | laura street
3  | identity_card  | bug street
3  | identity_card  | apple street
4  | driver_licence | 16th street
5  | identity_card  | 21st street

正如您所看到的那样,我正在查看每个ID,如果ID具有identity_card作为文档,我接受该行。如果没有identity_card但有护照,我就拿那条线,如果没有identity_card和护照,我就带上driver_licence。

我该怎么办?我想我可以使用" case ...当"但我无法弄清楚如何应用"案例......当"对我而言。

提前感谢!

2 个答案:

答案 0 :(得分:3)

一种方法使用dense_rank()

select t.*
from (select t.*,
             dense_rank() over (partition by id
                                order by case when document = 'identity_card' then 1
                                              when document = 'passport' then 2
                                              when document = 'drivers_license' then 3
                                              else 4
                                         end) as seqnum
      from t
     ) t
where seqnum = 1;

答案 1 :(得分:1)

现有查询中,添加:

, rank() over (partition by id order by case document when 'identity_card' then 1
                                                      when 'passport'      then 2
                                                      when ......................
                                                      ...........................
                                        end) as rnk

然后,在外部查询中,选择所有内容并添加

where rnk = 1
相关问题