web-dev-qa-db-ja.com

Oracle SQLのカスタムオーダー

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

例えば ​​:

  • BHT
  • 米ドル
  • MYR
  • JYP

次のようにソートする必要があります。

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

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

55
Rudy

これが単純であるかどうかわからない:

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)

番号を使用して並べ替え順序を定義する上記のソリューションでは、ケース/デコード式で言及されていない通貨が自動的に正しく並べ替えられません。

単にUSDを先頭に置き、残りを気にしないためには、「生成された」注文基準も文字値でなければなりません。その場合、次を使用できます。

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

「アルファベット順」の順序を使用します。これは、文字が数字の後にソートされるために機能します。 ('AAA'の代わりに'001'を使用しても同様に機能します)。

105

ソートが「柔軟」で、すべての通貨で機能することを確認するには、次を実行します。

SELECT <columns>
FROM <tableName>
ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn
20
Grzegorz W

特定の値を先頭または末尾に並べ替えるのに興味があるが、グループ内で並べ替える場合は、これを行うより詳細な方法:

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が下部に、残りがそれらの間でソートされます。

7
David Oneill

たぶんこれはあなたを助けるでしょう:

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

またはcaseを使用して

  order by 
      case 
        when currency = 'USD' then 1 
        else 2
      end
0
Parado

私は同じことをする必要がありましたが、複数の列で、次の簡単な追加で、Grzegorz Wの答えがこれに最適であることがわかりました:

SELECT <columns>
FROM <tableName>
ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn, anotherColumn;
0
SurfingSanta

MySQLのfunction FIELD()のような正規表現を使用したもう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
0
mishok