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')