Oracle TRANSLATE 函数不适用于 ORDER BY

Oracle TRANSLATE function not working on ORDER BY

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

如果我在 SELECT 中应用 TRANSLATE,然后按该列进行 ORDER BY,它就可以正常工作。在 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

您还没有在 order by 语句中为翻译功能提供一列。它总是在翻译 1.

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

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

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

ORDER BY UPPER(a1), a1