[英]Custom Order in Oracle SQL
我需要根據貨幣訂購交易。 但是我需要實現一個自定義排序方式,這使得美元總是排在最前面,而 rest 應該按升序排序。
例如:
應該排序如下:
有沒有簡單的方法來處理這個問題?
不知道這是否簡單:
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.