簡體   English   中英

對數字進行排序,最后優先級為0,優先級為PL / SQL關鍵字

[英]Sort numbers with 0 as the last priority, PL/SQL keyword for priority

我有:

PROCEDURE A
(
    inId    IN NUMBER,
    RC1           OUT SYS_REFCURSOR
) IS
tMessage VARCHAR2(128);

BEGIN
    OPEN RC1 FOR
           SELECT * FROM 
           (  
                  SELECT 
                         a.company,
                  SUM(a.holding_balance) balance
                  FROM  TableNameEntries A

                   WHERE
                        A.BATCH_ID = inId 
                   GROUP BY a.company        
           )
                   ORDER BY balance DESC  ; 

    EXCEPTION
        WHEN OTHERS THEN
             tMessage :='Exception ' || SQLCODE || ': ' || SQLERRM;            
    OPEN RC1 FOR
    SELECT tMessage FROM DUAL;

END A;

對於余額列,我的值類似於-1、0、1。 目前,它的排序方式類似於1 0 -1,但我不在乎零,因此我希望它類似於-1,1,0或1,-1,0

我如何在PL / SQL中做到這一點? 我試過了:

 SELECT 
                         a.company,
                  SUM(a.holding_balance) balance
                  FROM  REC.CAG_GL_ENTRIES A

                   WHERE
                        A.BATCH_ID = 201311 
                   order by case priority when 0 then 2 else 1 END   priority

但這是說PRIORITY是無效的標識符。

我該如何工作?

嘗試:

ORDER BY CASE balance 
            WHEN 0 THEN null
            ELSE balance
         END 
      DESC NULLS LAST

您的情況有兩種方式(第二種較為常見,第一種更為清晰):

SELECT a.company,
       SUM(a.holding_balance) balance
FROM  REC.CAG_GL_ENTRIES A
WHERE A.BATCH_ID = 201311 
order by abs(balance) desc;

SELECT a.company,
       SUM(a.holding_balance) balance
FROM  REC.CAG_GL_ENTRIES A
WHERE A.BATCH_ID = 201311 
order by decode(balance,1,1,-1,1,2);
ORDER BY SIGN(ABS(balance)) DESC, balance

ABS()將所有負片都變為正片。 SIGN()將0變為0,> 0變為1(<0到-1)。 與DESC結合使用時,所有零均位於末尾,而所有非零均位於其上方,並且沒有特定的順序。 然后,我再次按余額排序以對非零進行排序。

您也可以使用

order by balance * balance desc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM