Пользовательский заказ в Oracle SQL
Мне нужно заказать транзакцию на основе валюты.
Однако мне нужно реализовать собственный заказ, который делает доллар всегда на вершине, а остальные должны быть заказаны по возрастанию.
например:
следует сортировать следующим образом:
Есть ли простой способ справиться с этим?
Ответы
Ответ 1
Не знаю, соответствует ли это просто:
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'
также будет работать).
Ответ 2
Чтобы убедиться, что ваш тип "гибкий" и будет работать со всеми валютами, выполните следующие действия:
SELECT <columns>
FROM <tableName>
ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn
Ответ 3
Более подробный способ сделать это, если вам интересно отсортировать определенные значения до начала или конца, но отсортировать их в своей группе:
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 внизу, а остальные будут отсортированы между ними.
Ответ 4
Возможно, это поможет вам:
order by decode(currency, 'USD', 1, 2)
или используя case
order by
case
when currency = 'USD' then 1
else 2
end
Ответ 5
Мне нужно было сделать то же самое, но с несколькими столбцами, и нашел, что Grzegorz W ответил на все лучшее, со следующим простым дополнением:
SELECT <columns>
FROM <tableName>
ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn, anotherColumn;
Ответ 6
Еще один вариант с функцией регулярного выражения в 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
Ответ 7
Вы можете сделать следующее:
SELECT
*
FROM
yourtable
ORDER BY
REPLACE(FIND_IN_SET(currency,'USD,BHT,JPY,MYR'),0,'Z')