如何像 EXCEL 一样在 Oracle 中对带有“_”的文本进行排序?

Posted

技术标签:

【中文标题】如何像 EXCEL 一样在 Oracle 中对带有“_”的文本进行排序?【英文标题】:How to sort texts with '_' in Oracle exactly like EXCEL? 【发布时间】:2020-01-13 03:15:59 【问题描述】:

在 Excel 中,当我按升序对文本进行排序时,结果如下所示。带有下划线字符的文本位于其他文本之前。在 Excel 单元格中,当我输入 ="_"

C10_
C10A
C20_
C20A

但是,在 Oracle 中,当我按升序排序时,结果如下所示。 (我猜,Oracle 对待 '_'

C10A
C10_
C20A
C20_

如何让 Oracle 像 Excel 一样对列表进行排序?我已将 ASC 更改为 DESC,但结果并非我所期望的。

我的排序代码如下,

WITH DATAA AS (
SELECT *
FROM
(
SELECT 'C10_'rr  FROM DUAL
UNION
SELECT 'C10A' rr FROM DUAL
UNION
SELECT 'C20_' rr FROM DUAL
UNION
SELECT 'C20A' rr FROM DUAL
)
)
SELECT * 
FROM DATAA 
ORDER BY rr ASC;

【问题讨论】:

【参考方案1】:

您可以通过使用NLS_SORT 更改排序方法来实现此目的,如下所示:

根据 ORACLE 文档:

NLS_SORT 指定字符数据的排序类型。它覆盖 从 NLS_LANGUAGE 派生的默认值。

NLS_SORT 包含以下任一值:

NLS_SORT = 二进制 |排序名称

BINARY 指定二进制排序。 sort_name 指定语言排序 顺序。

这是实现结果的方法。

SQL> -- Your original query
SQL> --
SQL> WITH DATAA AS (
  2  SELECT *
  3  FROM
  4  (
  5  SELECT 'C10_'rr  FROM DUAL UNION
  6  SELECT 'C10A' rr FROM DUAL UNION
  7  SELECT 'C20_' rr FROM DUAL UNION
  8  SELECT 'C20A' rr FROM DUAL )
  9  )
 10  SELECT *
 11  FROM DATAA
 12  ORDER BY rr ASC;

RR
----
C10A
C10_
C20A
C20_

--

SQL> -- Now altering the sorting method
SQL> --
SQL> --
SQL> alter session set NLS_SORT = German;

Session altered.

SQL> --
SQL> --
SQL> -- Now see the result
SQL> --
SQL> --
SQL> WITH DATAA AS (
  2  SELECT *
  3  FROM
  4  (
  5  SELECT 'C10_'rr  FROM DUAL UNION
  6  SELECT 'C10A' rr FROM DUAL UNION
  7  SELECT 'C20_' rr FROM DUAL UNION
  8  SELECT 'C20A' rr FROM DUAL )
  9  )
 10  SELECT *
 11  FROM DATAA
 12  ORDER BY rr ASC;

RR
----
C10_
C10A
C20_
C20A

SQL>

干杯!!

【讨论】:

以上是关于如何像 EXCEL 一样在 Oracle 中对带有“_”的文本进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何像实体框架一样在Core Data的一个类文件中对属于一个实体的方法进行分组?

如何像在 Excel 中一样在 MySQL 中“填充系列”(线性步长值)?

如何在asp.net C# Webform中制作像网格一样的Excel

TSQL:如何格式化时间:'0.729166667' 像 Excel 一样:'5:30:00 pm'

像Excel一样使用python进行数据分析

像Excel一样使用python进行数据分析