标签: natural-sort

如何按 XYZ 等典型软件版本进行订购?

给定一个“SoftwareReleases”表:

| id | version |
|  1 | 0.9     |
|  2 | 1.0     |
|  3 | 0.9.1   |
|  4 | 1.1     |
|  5 | 0.9.9   |
|  6 | 0.9.10  |
Run Code Online (Sandbox Code Playgroud)

我如何产生这个输出?

| id | version |
|  1 | 0.9     |
|  3 | 0.9.1   |
|  5 | 0.9.9   |
|  6 | 0.9.10  |
|  2 | 1.0     |
|  4 | 1.1     |
Run Code Online (Sandbox Code Playgroud)

postgresql order-by sorting natural-sort

20
推荐指数
3
解决办法
1万
查看次数

是否有排序规则按以下顺序 1,2,3,6,10,10A,10B,11 对以下字符串进行排序?

我有一个包含不同长度整数的 VARCHAR 列的数据库。我想对它们进行排序,所以 10 在 9 之后,而不是 1,并且 70A 在 70 之后。我可以使用WHERE 子句中的PATINDEX()、CTE 和 CASE 语句来做到这一点。

但是,我想知道是否有不需要的整理。

sql-server collation sorting natural-sort

12
推荐指数
3
解决办法
2900
查看次数

ORDER BY和字母数字混合串的比较

我们需要对通常是需要“自然”排序的数字和字母混合字符串的值进行一些报告。诸如“P7B18”或“P12B3”之类的东西。@字符串将主要是字母序列然后数字交替。但是,这些段的数量和每个段的长度可能会有所不同。

我们希望这些数字部分按数字顺序排序。显然,如果我直接用 处理这些字符串值ORDER BY,那么“P12B3”将在“P7B18”之前出现,因为“P1”早于“P7”,但我希望相反,因为“P7”自然在前面“P12”。

我还希望能够进行范围比较,例如@bin < 'P13S6'或类似的。我不必处理浮点数或负数;这些将严格是我们正在处理的非负整数。字符串长度和段数可能是任意的,没有固定的上限。

在我们的例子中,字符串大小写并不重要,但如果有一种方法可以以排序方式感知方式做到这一点,其他人可能会发现这很有用。所有这一切中最丑陋的部分是我希望能够在WHERE子句中进行排序和范围过滤。

如果我在 C# 中执行此操作,这将是一项非常简单的任务:进行一些解析以将 alpha 与数字分开,实现 IComparable,您基本上就完成了。当然,SQL Server 似乎没有提供任何类似的功能,至少就我所知。

任何人都知道使这项工作有什么好的技巧吗?是否有一些很少公开的能力来创建实现 IComparable 的自定义 CLR 类型并使其按预期运行?我也不反对 Stupid XML Tricks(另请参阅:list concatenation),而且我在服务器上也提供了 CLR 正则表达式匹配/提取/替换包装函数。

编辑: 作为一个更详细的例子,我希望数据表现得像这样。

SELECT bin FROM bins ORDER BY bin

bin
--------------------
M7R16L
P8RF6JJ
P16B5
PR7S19
PR7S19L
S2F3
S12F0
Run Code Online (Sandbox Code Playgroud)

即将字符串分成所有字母或所有数字的标记,并分别按字母或数字对它们进行排序,最左边的标记是最重要的排序项。就像我提到的,如果您实现 IComparable,在 .NET 中是小菜一碟,但我不知道如何(或是否)您可以在 SQL Server 中执行此类操作。这肯定不是我在 10 年左右的工作中遇到过的事情。

sql-server collation sql-server-2012 sorting natural-sort

9
推荐指数
1
解决办法
7401
查看次数

为什么 Postgres ORDER BY 似乎中途忽略了前导下划线?

我有一个animal带有的表name varchar(255),并且我添加了具有以下值的行:

Piranha
__Starts With 2
Rhino
Starts With 1
0_Zebra
_Starts With 1
Antelope
_Starts With 1
Run Code Online (Sandbox Code Playgroud)

当我运行此查询时:

zoology=# SELECT name FROM animal ORDER BY name;
      name       
-----------------
0_Zebra
Antelope
Piranha
Rhino
_Starts With 1
_Starts With 1
Starts With 1
__Starts With 2
(8 rows)
Run Code Online (Sandbox Code Playgroud)

注意行是如何按顺序排序的,这意味着使用前导__Starts With 1行放在行之前Starts,但__in__Starts With 2似乎忽略了这一事实,好像2末尾比前两个字符更重要。

为什么是这样?

如果我用 Python 排序,结果是:

In  [2]: for animal in sorted(animals):
   ....:     print …
Run Code Online (Sandbox Code Playgroud)

postgresql order-by postgresql-9.1 natural-sort

8
推荐指数
1
解决办法
3696
查看次数

先按字母顺序再按数字

我有这样的记录

 A5
 A4
 Z1
 B2
 C7
 C1A
 C11A
 B1
 B4
Run Code Online (Sandbox Code Playgroud)

我希望它们以这种方式排序

A4
A5
B1
B2
B4
C1
C11A
C7
Z1
Run Code Online (Sandbox Code Playgroud)

使用该ORDER BY条款。

我希望它们按字母排序,然后按数值排序。

postgresql order-by sorting natural-sort

7
推荐指数
1
解决办法
2万
查看次数

排序时如何将字符串中的数字视为数字(“A3”排序在“A10”之前,而不是之后)

对于所有这些查询:

SELECT label FROM personal.storage_disks ORDER BY label ASC;
SELECT label FROM personal.storage_disks ORDER BY label COLLATE "C" ASC;
SELECT label FROM personal.storage_disks ORDER BY label COLLATE "POSIX" ASC;
SELECT label FROM personal.storage_disks ORDER BY label COLLATE "default" ASC;
Run Code Online (Sandbox Code Playgroud)

输出总是:DISK 1, DISK 10, DISK 2, DISK 3, [...]
但是,我想要并期望:DISK 1, DISK 2, DISK 3, [...] DISK 10

我现在没有根据SELECT * FROM pg_collation;......尝试的排序规则,除非我应该使用具有神秘名称的许多非常奇怪的排序规则之一。(我什至尝试了一堆结果相同的方法。)

请注意,我已经阅读了现有的看似相关的 SE 问题以及许多关于 的文章SORT BY,但它们没有帮助,也没有为我清除任何内容。

我正在使用 PostgreSQL 12.4

postgresql collation sorting natural-sort

6
推荐指数
2
解决办法
774
查看次数

Oracle 排序顺序已更改

我们最近使用较新版本的 Oracle (12c) 而不是 11r2 部署了一个新环境。

直到最近我才注意到我返回的数据的排序方式不同。

而不是有小写字母、大写字母和数字......(在 Oracle 11r2 上)我以相反的方式对我的数据进行排序:数字、大写字母、小写字母(Oracle 12c)

这确实让查询数据库的各种应用程序的最终用户感到困惑。我需要检查/比较哪些设置才能在 Oracle 12c 中解决此问题?

我提到的查询有一个 order by 子句。 编辑 这些参数的设置在两个环境上是相同的:

NLS_SORT 类型:字符串值:

nls_language 类型:字符串值:DUTCH

所以 NLS_SORT 没有值,那么默认值是多少?

@菲尔

select * from NLS_INSTANCE_PARAMETERS;

Parameter                     Oracle11r2          Oracle12c
NLS_LANGUAGE                       DUTCH              DUTCH
NLS_TERRITORY            THE NETHERLANDS    THE NETHERLANDS
NLS_SORT
NLS_DATE_LANGUAGE
NLS_DATE_FORMAT
NLS_CURRENCY
NLS_NUMERIC_CHARACTERS
NLS_ISO_CURRENCY
NLS_CALENDAR
NLS_TIME_FORMAT
NLS_TIMESTAMP_FORMAT
NLS_TIME_TZ_FORMAT
NLS_TIMESTAMP_TZ_FORMAT
NLS_DUAL_CURRENCY
NLS_COMP                          BINARY           BINARY
NLS_LENGTH_SEMANTICS                BYTE             CHAR
NLS_NCHAR_CONV_EXCP                FALSE            FALSE

select * from NLS_SESSION_PARAMETERS;

these are the same as my NLS settings in Oracle …
Run Code Online (Sandbox Code Playgroud)

oracle sorting oracle-12c natural-sort

5
推荐指数
1
解决办法
3228
查看次数

按数字字段对 varchar 进行排序

我确信以前有人问过这个问题,但由于这个问题可以用多种不同的方式表达,因此很难找到正确的答案。

我有一个订单表,其中订单有一个varchar字段,其格式为 4 位年份、破折号 (-) 和渐进数值。例如,它可能包含以下值:

SELECT number FROM orders ORDER BY number LIMIT 10;

  number  
----------
 1999-13
 2019-11
 2020-1
 2020-10
 2020-100
 2020-12
 2020-2
 2020-21
 2020-3
 2021-1
Run Code Online (Sandbox Code Playgroud)

我需要按年份对该字段进行排序,然后按渐进数字进行排序,预期结果如下:

  number  
----------
 1999-13
 2019-11
 2020-1
 2020-2
 2020-3
 2020-10
 2020-12
 2020-21
 2020-100
 2021-1
Run Code Online (Sandbox Code Playgroud)

数据库小提琴在这里

我的问题是:

  1. 使用 ORDER 子条款实现此目的最简单的方法是什么?
  2. 如何使用这种自定义排序添加高效索引而无需修改表?

我想至少保留第一个答案尽可能与数据库无关(这就是为什么我没有包含数据库特定标签的原因),但是如果不同的 DBMS/版本可能有不同的最佳答案,那么我们假设 PostgreSQL 12。

postgresql order-by natural-sort postgresql-12

1
推荐指数
1
解决办法
1696
查看次数