Oracle SQL中的自定义顺序
我需要根据货币来订购交易。 但是,我需要实施一个自定义的订单,这使得美元始终位居前列,其余部分应该按顺序排列。
例如 :
- BHT
- 美元
- MYR
- JYP
应按如下sorting:
- 美元
- BHT
- 日元
- MYR
有一个简单的方法来处理这个?
不知道这是否简单:
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)
使用数字来定义sorting顺序的上述解决scheme不会自动正确sorting货币/解码expression式中未提及的货币。
为了简单地把美元放在前面而不关心其余部分,“生成的”订单标准也必须是一个字符值。 在这种情况下,您可以使用以下内容:
order by case when currency = 'USD' then '001' else currency end
其中使用“按字母sorting”的顺序。 这是有效的,因为字符是按照数字sorting的。 (使用'AAA'
而不是'001'
也可以)。
为了确保您的sorting“灵活”,并将与所有货币一起工作,请执行以下操作:
SELECT <columns> FROM <tableName> ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn
一个更详细的方法,如果你有兴趣将某些值sorting到开始或结束,但有他们的组中sorting:
order by case when currency in ('USD', 'CAD') then '000'||currency when currency in ('ZWD', 'HTG') then 'ZZZ'||currency else currency end
这将使美元和加元位列榜首(sorting),ZWD和HTG位于底部,其余sorting。
也许这会帮助你:
order by decode(currency, 'USD', 1, 2)
或使用case
order by case when currency = 'USD' then 1 else 2 end
我需要做同样的事情,但有多个栏目,发现Grzegorz W的答案是最好的,只需添加下面的内容:
SELECT <columns> FROM <tableName> ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn, anotherColumn;
你可以做到以下几点:
SELECT * FROM yourtable ORDER BY REPLACE(FIND_IN_SET(currency,'USD,BHT,JPY,MYR'),0,'Z')