Sql 按输出按选择列表顺序返回LOV

Sql 按输出按选择列表顺序返回LOV,sql,oracle-apex,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

在我的应用程序中,我有一个页面,用户应该能够通过从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中的返回值如下所示
*非活动*姓5,前名5
*不活跃*姓6,Prename6
*不活跃*姓氏7,Prename7
姓1,Prename1
姓2,Prename2
姓3,Prename3
姓4,Prename4

但我希望它看起来像这样
1姓,Prename1
姓2,Prename2
姓3,Prename3
姓4,Prename4
*不活跃*姓5,Prename5
*不活跃*姓6,Prename6
*非活动*姓氏7,Prename7

现在回答我的问题。我希望将标记为非活动的用户放置在“正常”用户的下方,但“正常”用户按字母顺序排序,因此简单的
按d desc排序对我不起作用。我不知道是否可以在我的ApEx页面的设置或SQL代码本身中解决此问题。

我希望您理解我的问题并提出解决方案:)

按顺序排列用例,并在字符串开头分别添加“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

因此,所有的非活动数据最终都会出现。

您也可以按顺序使用CASE。请将您的预期输出数据发布到您的问题中。很抱歉没有提及,这只是我的测试数据库,CID只输入到我不想测试的生产数据库中