【问题标题】:Custom Order in Oracle SQLOracle SQL 中的自定义顺序
【发布时间】:2012-10-31 15:11:52
【问题描述】:

我需要根据货币订购交易。 但是我需要实现一个自定义 order by,这使得 USD 总是排在最前面,其余的应该按 asc 排序。

例如:

  • BHT
  • 美元
  • 马币
  • JYP

应该像这样排序:

  • 美元
  • BHT
  • 日元
  • 马币

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

【问题讨论】:

    标签: sql oracle sql-order-by


    【解决方案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 表达式中未提及的货币进行正确排序。

    为了简单地将美元放在前面而不关心其余部分,“生成”的订单条件也必须是一个字符值。在这种情况下,您可以使用以下内容:

    order by 
        case 
           when currency = 'USD' then '001' 
           else currency
        end
    

    使用“字母”排序。这是有效的,因为字符是在数字之后排序的。 (使用'AAA' 代替'001' 也可以)。

    【讨论】:

    • OP 以 4 个国家为例。我不认为上面是正确的方法......就像手动做......如果我将国家添加为 ARG 怎么办?您会再次更改您的查询吗?
    • @FahimParkar:这就是我使用字符排序添加解决方案的原因。这会将美元放在首位,其他所有内容按字母顺序排列(我在第二个解决方案中删除了硬编码货币)。
    • 嗯,第二个是不错的解决方案。为此 +1 :)
    • 这很好,谢谢!有没有办法我也可以通过某种新的排序过滤我的 where 子句?比如这个字段在哪里是
    • 解码比机箱慢吗?超过 100 万条记录?
    【解决方案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
      

      这会将美元和加元放在列表的顶部(排序),ZWD 和 HTG 放在底部,其余的在它们之间排序。

      【讨论】:

      • 很好的答案!帮助我避免做“联合”。谢谢朋友。
      【解决方案4】:

      也许这会对你有所帮助:

      order by decode(currency, 'USD', 1, 2)
      

      或使用case

        order by 
            case 
              when currency = 'USD' then 1 
              else 2
            end
      

      【讨论】:

        【解决方案5】:

        另一个带有正则表达式的变体,例如 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
        

        【讨论】:

          【解决方案6】:

          您可以执行以下操作:

          SELECT 
            * 
          FROM
            yourtable
          ORDER BY
            REPLACE(FIND_IN_SET(currency,'USD,BHT,JPY,MYR'),0,'Z')
          

          【讨论】:

            【解决方案7】:

            我需要做同样的事情,但有多个列,并发现 Grzegorz W 的答案对此最好,并添加以下简单内容:

            SELECT <columns>
            FROM <tableName>
            ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn, anotherColumn;
            

            【讨论】:

            • 投了反对票的人想解释为什么?如果我的代码与我的文本不匹配,那么当然,投反对票并解释为什么你认为它是错误的。如果不是,那真的吗?!当然,我的答案与 OP 的问题不完全匹配,但我在搜索问题的答案时遇到了这个线程,而 Grzegorz W 的答案最符合我的问题。因此,我为下一个正在寻找与我相同答案的人的利益重新发布了我的确切解决方案。在我看来,这就是 stackoverflow 的美妙之处。我从和我一样的帖子中找到了许多问题的解决方案。
            • 可能被否决(不是我),因为您添加了 anotherColumn 但没有解释它是什么或为什么需要这样做。如果我发布了与您完全相同的答案并包含 yetAnotherColumn,我预计会遭到反对。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-06-26
            • 2021-07-25
            • 1970-01-01
            • 1970-01-01
            • 2014-02-21
            • 2010-10-08
            • 1970-01-01
            相关资源
            最近更新 更多