首页 > 解决方案 > Oracle TRANSLATE 功能不适用于 ORDER BY

问题描述

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

如果我在我的 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

标签: sqloracletranslate

解决方案


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

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

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

请注意,如果您只是使用它进行排序,则可以通过以下方式以更具可读性的方式实现相同的目标:

ORDER BY UPPER(a1), a1

推荐阅读