DISTINCT 实际上用 SELECT 子句中给出的任何表达式过滤了结果集中的 UNIQUE 内容。
我们无法使用不同的表达式或列名对其进行排序。请在此处查看示例。
SQL> l
1 SELECT DISTINCT (col1),(col2)
2 FROM
3 ( SELECT 'Hello' col1,'World' col2 FROM DUAL
4 UNION ALL
5 SELECT 'HELLO','WORLD' FROM DUAL
6* )
SQL> /
COL1 COL2
----- -----
HELLO WORLD
Hello World
你可以看到DISTINCT在这里是CASE SENSITIVE。(显示2行)
所以,让我在两列上都写一个UPPER()。
SQL> l
1 SELECT DISTINCT UPPER (col1),UPPER(col2)
2 FROM
3 ( SELECT 'Hello' col1,'World' col2 FROM DUAL
4 UNION ALL
5 SELECT 'HELLO','WORLD' FROM DUAL
6* )
SQL> /
UPPER UPPER
----- -----
HELLO WORLD
只显示 1 行,忽略大小写。
回到实际问题。要在DISTINCT 结果集上订购某些东西,它必须是DISTINCT 子句的表达式/列的一部分。
所以,当您发出DISTINCT COL1,COl2 时,顺序可能是COL1 或COL2/.. 它不能是COL3 甚至UPPER(COL1),因为 UPPER() 使不同的表达式与表达式冲突超过 DISTINCT。
最后,问题的答案将是
如果您希望您的ORDER 不区分大小写,DISTINCT 也必须这样做!如下所示
SELECT DISTINCT
UPPER(asssss),
saas_acc
FROM DUAL
ORDER BY upper(asssss) ASC ;
或者如果必须使用 UNION,最好这样做,或与上述相同。
SELECT * FROM
(
SELECT DISTINCT asssss as asssss,
saas_acc
FROM DUAL
UNION
SELECT '--ALL--','ALL' FROM DUAL
)
ORDER BY upper(asssss) ASC ;
出于我自己的经验,我一直觉得,ORDER BY 中指定的任何表达式/列,它隐含带到最终SELECT也是。排序实际上只是基于结果中的列号(位置)。在这种情况下,DISTINCT COL1,COl2 已经存在。当您提供ORDER BY UPPER(COL1) 时,它会尝试附加到SELECT 表达式中,这完全可能是NOT。所以,语义检查自己,会取消这个查询的错误!