![](/img/trans.png)
[英]ORA-01785: ORDER BY item must be the number of a SELECT-list expression
[英]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.