繁体   English   中英

按SELECT-LIST顺序返回LOV

[英]Return of LOV in SELECT-LIST order by output

在我的应用程序中,我有一个页面,用户应该可以通过选择列表为任务选择创建者,该选择列表从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的简单order by d desc对我不起作用。 我不知道是否可以在我的ApEx页面的设置或SQL代码本身中解决它。
希望您了解我的问题并提出解决方案:)

在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

在获得下表的定义后,

 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 * 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;

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

  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;

输出为:

 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

因此,所有不活动的数据最后出现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM