如何根据sql中的status字段获取Active状态?

时间:2017-07-04 19:04:34

标签: sql oracle oracle11g oracle10g

  

假设2行中存在活动和非活动状态

select * from table name where status in (Active,Inactive);
  

如果活跃状态是需要考虑作为第一优先级,否则需要获得非活动状态

任何人都可以建议一些解决方案

    SCH_NAME,   STATE,  VER

1 pk计划2
2 pk Active 1

2 个答案:

答案 0 :(得分:0)

不确定优先的含义,但我认为您打算使用CASE条件

WHERE Status = CASE 
                          WHEN Status = 'Active' 
                               THEN 'Active'
                          ELSE NULL 
                     END 

答案 1 :(得分:0)

我认为(sch_name,ver)是主键。

这是我的解决方案:

  1. 为每个状态分配一个ID(1:活动,2:计划/被动)
  2. 对于每一行,获取(sch_name)字段和(sch_name,ver)字段的最小状态ID
  3. 仅返回两个值等于的行
  4. 它的工作原因是:

    • 如果sch_name有"有效" row,这将是最小状态id(因此不会为该sch_name返回被动行)。
    • 如果sch_name没有" Active"在行中,最小状态ID将是分配给"被动"的那个,所以只有"被动"将返回行

      create table user3231655 
      (
         schname varchar2(20),
         st   varchar2(20),
         vr   integer
       );
      
       delete user3231655;
       insert into user3231655 values ('pk','Active',1);
       insert into user3231655 values ('pk','Planned',2);
       insert into user3231655 values ('fk','Planned',2);
      
       select * from (
       select a.*, min(case st when 'Active' then 1 when 'Planned' then 2 end) ver (partition by schname) as min1,
               min(case st when 'Active' then 1 when 'Planned' then 2 end) ver (partition by schname, vr) as min2
       from user3231655 a
       ) b
       where min1=min2
      

    肯定有更优雅的方法来解决它。