如何使用 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
时,顺序可能是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
。所以,语义检查自己,会取消这个查询的错误!
【讨论】:
【参考方案3】:要排序不区分大小写,您需要将 NLS_COMP 设置为 ANSI
NLS_COMP=ANSI
详情:http://www.orafaq.com/node/999
【讨论】:
【参考方案4】:您可以使用upper
或lower
函数。
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 仅适用于特定列