64

我需要根据货币订购交易。但是我需要实现一个自定义的 order by,这使得 USD 总是排在最前面,其余的应该按 asc 排序。

例如 :

  • BHT
  • 美元
  • 马币
  • JYP

应该像这样排序:

  • 美元
  • BHT
  • 日元
  • 马币

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

4

7 回答 7

128

不知道这是否有资格这么简单:

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)

上述使用数字定义排序顺序的解决方案不会自动对 case/decode 表达式中未提及的货币进行正确排序。

为了简单地将美元放在前面而不关心其余的,“生成”的订单标准也必须是一个字符值。在这种情况下,您可以使用以下内容:

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

它使用“字母”排序。这是有效的,因为字符是在数字之后排序的。(使用'AAA'代替'001'也可以)。

于 2012-11-12T07:14:44.823 回答
22

为了确保您的排序是“灵活的”并且适用于所有货币,请执行以下操作:

SELECT <columns>
FROM <tableName>
ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn
于 2012-11-12T07:18:43.457 回答
9

一种更详细的方法,如果您对将某些值排序到开头或结尾感兴趣,但将它们排序在他们的组中:

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

这将把美元和加元放在列表的顶部(排序),ZWD 和 HTG 放在底部,其余的在它们之间排序。

于 2015-11-10T20:53:51.110 回答
1

也许这会帮助你:

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

或使用case

  order by 
      case 
        when currency = 'USD' then 1 
        else 2
      end
于 2012-11-12T07:18:47.530 回答
0

FIELD()MySQL 中的另一种类似正则表达式的变体:

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
于 2019-04-18T14:08:01.610 回答
-1

您可以执行以下操作:

SELECT 
  * 
FROM
  yourtable
ORDER BY
  REPLACE(FIND_IN_SET(currency,'USD,BHT,JPY,MYR'),0,'Z')
于 2015-08-12T14:01:46.820 回答
-2

我需要做同样的事情,但有多个列,并发现 Grzegorz W 的回答对此最好,并添加以下简单内容:

SELECT <columns>
FROM <tableName>
ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn, anotherColumn;
于 2016-05-19T04:14:09.737 回答