Oracle SQL中的自定义顺序

Rud*_*udy 59 sql oracle sql-order-by

我需要根据货币订购交易.但是我需要实现一个自定义订单,这使得美元始终位于顶部,其余的应该按顺序排序.

例如 :

  • BHT
  • 美元
  • MYR
  • JYP

应按如下排序:

  • 美元
  • BHT
  • 日元
  • MYR

有一个简单的方法来处理这个?

a_h*_*ame 110

不知道这是否合格:

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
Run Code Online (Sandbox Code Playgroud)

或者更紧凑但特定于Oracle:

order by decode(currency, 'USD', 1, 'BHT', 2, 'JPY', 3, 'MYR', 4, 5)
Run Code Online (Sandbox Code Playgroud)

上面使用数字来定义排序顺序的解决方案不会自动对货币/解码表达式中未提及的货币进行自动排序.

简单地将美元放在前面并且不关心其余部分,"生成的"订单标准也必须是字符值.在这种情况下,您可以使用以下内容:

order by 
    case 
       when currency = 'USD' then '001' 
       else currency
    end
Run Code Online (Sandbox Code Playgroud)

它使用"按字母顺序"排序.这是有效的,因为字符在数字后面排序.(使用'AAA'而不是'001'工作).

  • OP以4个国家为例.我不认为上面是正确的方式......它就像手动做...如果我将国家添加为ARG怎么办?你会再次改变你的查询吗? (2认同)

Grz*_*z W 21

要确保您的排序"灵活"并且适用于所有货币,请执行以下操作:

SELECT <columns>
FROM <tableName>
ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn
Run Code Online (Sandbox Code Playgroud)


Dav*_*ill 8

更详细的方法,如果您有兴趣将某些值排序到开头或结尾,但将这些值排序在其组中:

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

这将使USD和CAD位于列表的顶部(已排序),ZWD和HTG位于底部,其余部分在这些之间进行排序.