【发布时间】:2012-10-31 15:11:52
【问题描述】:
我需要根据货币订购交易。 但是我需要实现一个自定义 order by,这使得 USD 总是排在最前面,其余的应该按 asc 排序。
例如:
- BHT
- 美元
- 马币
- JYP
应该像这样排序:
- 美元
- BHT
- 日元
- 马币
有没有简单的方法来处理这个问题?
【问题讨论】:
标签: sql oracle sql-order-by
我需要根据货币订购交易。 但是我需要实现一个自定义 order by,这使得 USD 总是排在最前面,其余的应该按 asc 排序。
例如:
应该像这样排序:
有没有简单的方法来处理这个问题?
【问题讨论】:
标签: sql oracle sql-order-by
不知道这算不算简单:
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
【讨论】:
另一个带有正则表达式的变体,例如 MySQL 中的函数 FIELD():
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;
【讨论】: