按SELECT-LIST顺序返回LOV

时间:2018-11-13 08:54:37

标签: sql oracle-apex

在我的应用程序中,有一个页面,用户可以通过选择列表从LOV获取其值的选择列表中为任务选择创建者。
多数民众赞成在其中的代码:

select case
       when USER_STATUS = '0' then '*INACTIVE* '|| LAST_NAME || ',' || CDISPLAYNAME 
       else  LAST_NAME || ',' || CDISPLAYNAME 
       end as d, CID r
from   TABLE_TEST
order by d asc;

我的表的声明如下。

create TABLE TABLE_TEST(
    LAST_NAME VARCHAR2(75 BYTE),
    CDISPLAYNAME VARCHAR2(50 BYTE),
    USER_STATUS NUMBER DEFAULT 1 --Can also be 0 (inactive) or 3 (System User)
);

所以我的问题是,SELECT-LIST中的返回值显示如下
*INACTIVE* Surname5,Prename5 *INACTIVE* Surname6,Prename6 *INACTIVE* Surname7,Prename7 Surname1,Prename1 Surname2,Prename2 Surname3,Prename3 Surname4,Prename4

但是我希望它看起来像这样
Surname1,Prename1 Surname2,Prename2 Surname3,Prename3 Surname4,Prename4 *INACTIVE* Surname5,Prename5 *INACTIVE* Surname6,Prename6 *INACTIVE* Surname7,Prename7

现在我的问题。我希望标记为 INACTIVE 的用户位于“普通”用户下方,但“普通”用户按字母顺序排列,因此简单的order by d desc对我不起作用。我不知道是否可以通过我的ApEx页面的设置或SQL代码本身来解决它。
希望您了解我的问题并提出解决方案:)

2 个答案:

答案 0 :(得分:1)

在ORDER BY中使用CASE,并在字符串的开头分别添加“ 1”和“ 0”以优先排序

SELECT case
   when USER_STATUS = '0' then '*INACTIVE* '|| LAST_NAME || ',' || CDISPLAYNAME 
   else  LAST_NAME || ',' || CDISPLAYNAME 
   end as d
FROM TABLE_TEST
ORDER BY
  CASE WHEN USER_STATUS = '0' THEN  '1' || d
  ELSE '0' || d 
  END ASC

答案 1 :(得分:0)

在获得下表的定义后,

 select * from table_test;

 LAST_NAME  CDISPLAYNAME    USER_STATUS
     A              T1        1
     B              T1        1
     B1             T2        0
     B2             T3        0
     B3             T4        1

下表中插入了一些虚拟数据:

  select 
       case
       when USER_STATUS = '0' 
       then '*INACTIVE* '|| LAST_NAME || ',' || CDISPLAYNAME 
       else  LAST_NAME || ',' || CDISPLAYNAME 
        end as d, CID r
   from TABLE_TEST
  order by d asc;

当我触发您在上面发布的给定查询时:

  select 
       case
       when USER_STATUS = '0' 
       then '*INACTIVE* '|| LAST_NAME || ',' || CDISPLAYNAME 
       else  LAST_NAME || ',' || CDISPLAYNAME 
        end as d
   from TABLE_TEST
  order by d asc;

表不包含任何CID列,因此无法正常工作。 因此,在删除CID列之后,

 D
 *INACTIVE* B1,T2
 *INACTIVE* B2,T3
  A,T1
  B,T1
  B3,T4

输出为:

   WITH T as
           (select case
               when USER_STATUS = '0' 
               then '*INACTIVE* '|| LAST_NAME || ',' || CDISPLAYNAME 
               else  LAST_NAME || ',' || CDISPLAYNAME 
               end as d, CDISPLAYNAME r
              from   TABLE_TEST
             order by d asc)

             select * from T order by d desc;

因此更改后的查询为:

    D               R
    B3,T4           T4
    B,T1            T1
    A,T1            T1
  *INACTIVE* B2,T3  T3
  *INACTIVE* B1,T2  T2

所以输出是:

getFragmentManager()

所有未激活的数据都最后出现了。