如何使用不区分大小写的ASC或DESC,使用DISTINCT和UNION进行排序

时间:2014-01-24 07:56:04

标签: oracle plsql oracle11g

如何通过不区分大小写的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 item must be the number of a SELECT-list expression

4 个答案:

答案 0 :(得分:1)

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

您可以在此处看到DISTINCTCASE 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 Resultset上订购某些内容,它必须是DISTINCT子句的表达式/列的一部分。

因此,当您发出DISTINCT COL1,COl2时,订单可能是COL1COL2 / ..它不能是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中指定的表达式/列是什么,隐式地被带到最终{ {1}}也是。排序实际上只是基于结果中的列号(位置)。在这种情况下,SELECT已经存在。当您提供DISTINCT COL1,COl2时,系统会尝试将其附加到ORDER BY UPPER(COL1)表达式中,该表达式可能SELECT。因此, Semantic 检查自身,取消此查询错误

答案 1 :(得分:0)

要对不区分大小写进行排序,您需要将NLS_COMP设置为ANSI

   NLS_COMP=ANSI

详细信息:http://www.orafaq.com/node/999

答案 2 :(得分:0)

您可以使用upperlower个功能。

order by upper(columnName)

<强> UPDATE1

尝试从查询中删除order-by子句,这将为您提供正确的错误,即ORA-00904: "SAAS_ACC": invalid identifier。因此,您可以在google上搜索此错误,或在SO上提出其他问题。

另请查看how to use order by in union

答案 3 :(得分:0)

最简单的选择是按上(或下)案例列数据

进行排序
ORDER BY UPPER( column_name )