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

Posted

技术标签:

【中文标题】如何使用 DISTINCT 和 UNION 按不区分大小写的 ASC 或 DESC 排序【英文标题】:How to order by case insensitive ASC or DESC, with DISTINCT and UNION 【发布时间】:2014-01-24 07:56:04 【问题描述】:

如何为 P/L sql 11g 按不区分大小写的 ASC 或 DESC 排序。这个 p/l sql 基本问题,但我在 Google 中找不到好的答案,请告诉如何对选择结果进行排序,不区分大小写

这是我试过的

   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

【问题讨论】:

您的查询似乎没有多大意义。 UNION 已经完成了 DISTINCT,因此两者都没有理由。您的首要查询选择了 dual 中不存在的两列。 【参考方案1】:

最简单的选择是按大写(或小写)列数据排序

ORDER BY UPPER( column_name )

【讨论】:

我试过这个,但给我的错误是 ORA-01785: ORDER BY item must be the number of a SELECT-list expression @Duleep 请参阅我的回答的 Update1。【参考方案2】:

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 时,顺序可能是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 中指定的任何表达式/列,它隐含带到最终SELECT也是。排序实际上只是基于结果中的列号(位置)。在这种情况下,DISTINCT COL1,COl2 已经存在。当您提供ORDER BY UPPER(COL1) 时,它会尝试附加到SELECT 表达式中,这完全可能是NOT。所以,语义检查自己,会取消这个查询的错误

【讨论】:

【参考方案3】:

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

   NLS_COMP=ANSI

详情:http://www.orafaq.com/node/999

【讨论】:

【参考方案4】:

您可以使用upperlower 函数。

order by upper(columnName)

更新1

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

也可以看看how to use order by in union。

【讨论】:

以上是关于如何使用 DISTINCT 和 UNION 按不区分大小写的 ASC 或 DESC 排序的主要内容,如果未能解决你的问题,请参考以下文章

sql中,只使用union和先union all再distinct,两种方式哪个效率高?

RDD的distinct,intersection,union和subtract的使用问题

Postgres distinct union 仅适用于特定列

我可以在 MySQL 中将 Distinct 与 Union All 一起使用吗?

MYSQL UNION DISTINCT

UNION DISTINCT