![](/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.