[英]Custom Order in Oracle SQL
我需要根据货币订购交易。 但是我需要实现一个自定义排序方式,这使得美元总是排在最前面,而 rest 应该按升序排序。
例如:
应该排序如下:
有没有简单的方法来处理这个问题?
不知道这是否简单:
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)
上面使用数字定义排序顺序的解决方案将不会自动对案例/解码表达式中未提及的货币进行正确排序。
为了简单地将美元放在首位而不关心其余部分,“生成的”订单条件也必须是字符值。 在这种情况下,您可以使用以下命令:
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
与regexp类似的另一种变体,例如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
如果您想要定制订单,我建议您使用“FIELD”。
SELECT * FROM table ORDER BY FIELD(column,"case 1","case 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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.