Sql 按输出按选择列表顺序返回LOV
在我的应用程序中,我有一个页面,用户应该能够通过从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
这就是它的代码:
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只输入到我不想测试的生产数据库中