Подтвердить что ты не робот

Пользовательский заказ в Oracle SQL

Мне нужно заказать транзакцию на основе валюты. Однако мне нужно реализовать собственный заказ, который делает доллар всегда на вершине, а остальные должны быть заказаны по возрастанию.

например:

  • BHT
  • USD
  • MYR
  • JYP

следует сортировать следующим образом:

  • USD
  • BHT
  • JPY
  • MYR

Есть ли простой способ справиться с этим?

4b9b3361

Ответ 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')