如何通过不区分大小写的ASC或DESC为P / L sql 11g订购.这个p / l sql基本问题,但我在谷歌找不到好的答案,请告诉我如何排序选择结果不区分大小写
这是我试过的
SELECT DISTINCT asssss,saas_acc FROM DUAL UNION SELECT '--ALL--','ALL' FROM DUAL ORDER BY upper(asssss) ASC ;
给我的ORA-01785:ORDER BY项必须是SELECT列表表达式的编号
解决方法
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' FROM DUAL 6* ) sql> / UPPER UPPER ----- ----- HELLO WORLD
只显示1行,忽略大小写.
回到实际问题.要在DISTINCT结果集上订购某些内容,它必须是DISTINCT子句的表达式/列的一部分.
因此,当您发出DISTINCT COL1,COl2时,order by可能是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表达式中,这根本不可能.因此,语义检查本身会使用Error错误地取消此查询!