我需要根据货币订购交易。但是我需要实现一个自定义的 order by,这使得 USD 总是排在最前面,其余的应该按 asc 排序。
例如 :
- BHT
- 美元
- 马币
- JYP
应该像这样排序:
- 美元
- BHT
- 日元
- 马币
有没有简单的方法来处理这个?
我需要根据货币订购交易。但是我需要实现一个自定义的 order by,这使得 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)
上述使用数字定义排序顺序的解决方案不会自动对 case/decode 表达式中未提及的货币进行正确排序。
为了简单地将美元放在前面而不关心其余的,“生成”的订单标准也必须是一个字符值。在这种情况下,您可以使用以下内容:
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
这将把美元和加元放在列表的顶部(排序),ZWD 和 HTG 放在底部,其余的在它们之间排序。
也许这会帮助你:
order by decode(currency, 'USD', 1, 2)
或使用case
order by
case
when currency = 'USD' then 1
else 2
end
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
您可以执行以下操作:
SELECT
*
FROM
yourtable
ORDER BY
REPLACE(FIND_IN_SET(currency,'USD,BHT,JPY,MYR'),0,'Z')
我需要做同样的事情,但有多个列,并发现 Grzegorz W 的回答对此最好,并添加以下简单内容:
SELECT <columns>
FROM <tableName>
ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn, anotherColumn;