64

通貨に基づいて取引を注文する必要があります。ただし、カスタム注文を実装する必要があります。これにより、USDが常に一番上になり、残りは昇順で注文する必要があります。

例えば ​​:

  • BHT
  • 米ドル
  • MYR
  • JYP

次のように並べ替える必要があります:

  • 米ドル
  • BHT
  • 日本円
  • MYR

これを処理する簡単な方法はありますか?

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式に記載されていない通貨が自動的に正しく並べ替えられません。

単純にUSDを先頭に置き、残りを気にしないために、「生成された」注文基準も文字値である必要があります。その場合、以下を使用できます。

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

これにより、USDとCADがリストの一番上(並べ替え)に配置され、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の正規表現のような関数を持つもう1つのバリアント:

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 に答える