加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

oracle – 如何通过不区分大小写的ASC或DESC,使用DISTINCT和UNIO

发布时间:2021-01-12 13:04:36 所属栏目:站长百科 来源:网络整理
导读:如何通过不区分大小写的ASC或DESC为P / L sql 11g订购.这个p / l sql基本问题,但我在谷歌找不到好的答案,请告诉我如何排序选择结果不区分大小写 这是我试过的 SELECT DISTINCT asssss,saas_acc FROM DUAL UNION SELECT '--ALL--','ALL' FROM DUAL ORDER BY u

如何通过不区分大小写的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错误地取消此查询!

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!