通貨に基づいて取引を注文する必要があります。ただし、カスタムオーダーを実装する必要があります。これにより、USDが常に最上位になり、残りはascで注文する必要があります。
例えば :
次のようにソートする必要があります。
これを処理する簡単な方法はありますか?
これが単純であるかどうかわからない:
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'
を使用しても同様に機能します)。
ソートが「柔軟」で、すべての通貨で機能することを確認するには、次を実行します。
SELECT <columns>
FROM <tableName>
ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn
特定の値を先頭または末尾に並べ替えるのに興味があるが、グループ内で並べ替える場合は、これを行うより詳細な方法:
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が下部に、残りがそれらの間でソートされます。
たぶんこれはあなたを助けるでしょう:
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;
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