【问题标题】:Oracle TRANSLATE function not working on ORDER BYOracle TRANSLATE 功能不适用于 ORDER BY
【发布时间】:2019-11-22 14:07:11
【问题描述】:

我想在我的 Oracle ORDER BY 上使用 TRANSLATE 将列排序为 A、a、B、b...Z、z 而不是 A-Z、a-z。

如果我在我的 SELECT 中应用 TRANSLATE,然后按该列排序,它可以正常工作。对 ORDER BY 编码 TRANSLATE 似乎没有任何影响。

SELECT a1,  
       translate(a1,
                 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz',
                 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz') AS sort_col
FROM (SELECT * 
        FROM (SELECT 'A' AS a1 FROM dual UNION 
              SELECT 'a' AS a1 FROM dual UNION
              SELECT 'B' AS a1 FROM dual UNION
              SELECT '#' AS a1 FROM dual UNION
              SELECT '0' AS a1 FROM dual ) )
--ORDER BY 2 
ORDER BY TRANSLATE(1,
                  'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz',
                  'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')

输出顺序应该是#,0,A,a,B

【问题讨论】:

    标签: sql oracle translate


    【解决方案1】:

    您没有在 order by 语句中为 Translate 函数指定一列。它总是在翻译1

    将您订单中的1 替换为您尝试排序的a1 列。

    ORDER BY TRANSLATE(a1,
                      'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz',
                      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')
    

    请注意,如果您只是将其用于排序,则可以通过以下方式以更易读的方式实现相同的目标:

    ORDER BY UPPER(a1), a1
    

    【讨论】:

    • 谢谢。我将语法读作 ORDER BY 上的“列号”。
    • 事后看来,当我第一次使用 UNIONed 结果集尝试此操作时,我发现我横盘整理,该结果集在 ORDER BY 请求“列号”时发出错误。切换到子选择结果后,我从未更改过列号。关于 UPPER 选项,这是一个混合大小写列的简化示例,需要分别对上/下进行排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    相关资源
    最近更新 更多