簡體   English   中英

自定義訂單 Oracle SQL

[英]Custom Order in Oracle SQL

我需要根據貨幣訂購交易。 但是我需要實現一個自定義排序方式,這使得美元總是排在最前面,而 rest 應該按升序排序。

例如:

  • BHT
  • 美元
  • 令吉
  • JYP

應該排序如下:

  • 美元
  • BHT
  • 日元
  • 令吉

有沒有簡單的方法來處理這個問題?

不知道這是否簡單:

order by 
    case 
       when currency = 'USD' then 1 
       when currency = 'BHT' then 2
       when currency = 'JPY' then 3
       when currency = 'MYR' then 4
       else 5
    end

或更緊湊,但特定於Oracle:

order by decode(currency, 'USD', 1, 'BHT', 2, 'JPY', 3, 'MYR', 4, 5)

上面使用數字定義排序順序的解決方案將不會自動對案例/解碼表達式中未提及的貨幣進行正確排序。

為了簡單地將美元放在首位而不關心其余部分,“生成的”訂單條件也必須是字符值。 在這種情況下,您可以使用以下命令:

order by 
    case 
       when currency = 'USD' then '001' 
       else currency
    end

它使用“字母順序”排序。 這是有效的,因為字符在數字后排序。 (也可以使用'AAA'代替'001' )。

為確保您的排序“靈活”且可與所有貨幣一起使用,請執行以下操作:

SELECT <columns>
FROM <tableName>
ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn

如果您對將某些值排序到開頭或結尾感興趣,但又將它們排序在它們的組中,則這是一種更詳細的方法:

order by
  case when currency in ('USD', 'CAD') 
    then '000'||currency
  when currency in ('ZWD', 'HTG')
    then 'ZZZ'||currency
  else currency 
  end

這會將USD和CAD放在列表的頂部(排序),將ZWD和HTG放在列表的底部,其余排序在這兩個之間。

也許這會幫助您:

order by decode(currency, 'USD', 1, 2)

或用case

  order by 
      case 
        when currency = 'USD' then 1 
        else 2
      end

與regexp類似的另一種變體,例如MySQL中的FIELD()函數:

select
meas_code,
to_number(regexp_replace(meas_code, replace('(meas1,meas2,meas3)', ',', '|'), instr(replace('(meas1,meas2,meas3)', ',', '|'), meas_code))) ordr
from (select cast(column_value as varchar2(10)) as meas_code from xmltable('''meas1'',''meas2'',''meas3'''))
order by 2

如果您想要定制訂單,我建議您使用“FIELD”。

SELECT * FROM table ORDER BY FIELD(column,"case 1","case 2",...);

您可以執行以下操作:

SELECT 
  * 
FROM
  yourtable
ORDER BY
  REPLACE(FIND_IN_SET(currency,'USD,BHT,JPY,MYR'),0,'Z')

我需要做同樣的事情,但是有多列,並發現Grzegorz W對此最有幫助,並添加了以下簡單內容:

SELECT <columns>
FROM <tableName>
ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn, anotherColumn;

暫無
暫無

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

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