繁体   English   中英

自定义订单 Oracle SQL

[英]Custom Order in Oracle SQL

我需要根据货币订购交易。 但是我需要实现一个自定义排序方式,这使得美元总是排在最前面,而 rest 应该按升序排序。

例如:

  • BHT
  • 美元
  • 令吉
  • JYP

应该排序如下:

  • 美元
  • BHT
  • 日元
  • 令吉

有没有简单的方法来处理这个问题?

不知道这是否简单:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM