JavaScript中复制PostgreSQL排序结果的最佳方法是什么?

4

我将尝试复制PostgreSQL排序结果以进行测试目的。

假设您有一个名为temp的表,其中包含一个单独的列name,其中包含以下行:

dolores et
dolor nemo
abc
zxc

现在运行以下查询:
SELECT * from temp ORDER BY name ASC

排序结果为:
abc
dolores et
dolor nemo
zxc

然而,在编程语言中,排序的默认实现将返回不同的结果:

abc
dolor nemo
dolores et
zxc

在JavaScript中:

["dolores et", "dolor nemo", 'abc' , 'zxc'].sort()
// returns ["abc", "dolor nemo", "dolores et", "zxc"]

我想知道是否有一种简单的方法可以在JavaScript中复制数据库中排序的结果(我正在使用NodeJS),以便我可以在我的测试中验证它。我相信我在这里缺少了非常简单的东西。任何帮助都将不胜感激。
我可以尝试使用此函数来强制PostgreSQL中的顺序,但我不想这样做。我的目标是复制JavaScript中的默认行为。
1个回答

3

对于字符串进行排序时,总是会使用某种排序规则。如果在您的编程语言中没有意识到使用排序规则,则可能正在使用POSIX排序规则,该规则根据其代码点(编码中的数字值)逐个字符比较字符串。

在PostgreSQL中,看起来像这样:

ORDER BY name COLLATE "POSIX";

要解决您的问题,您需要找出该列的排序规则。

如果在列定义中没有指定特殊的排序规则,它将使用数据库的排序规则,可以通过以下方式找到:

SELECT datcollate FROM pg_database WHERE datname = 'my_database';

那将是一个来自C库的操作系统整理(collation)。

因此,您所要做的就是在程序中使用该整理(collation)。

如果您的程序是用C语言编写的,您可以直接使用C库。否则,请参考您所使用的编程语言文档。


1
谢谢您的解释。我有一个小问题:我使用了相同的排序规则,但是通过忽略比较中的标点符号(例如 ["dolores et", "dolor nemo", 'abc' , 'zxc'].sort((a,b) => a.localeCompare(b, 'en-us', {ignorePunctuation: true}))),我成功地使其工作。那么 PostgreSQL 是否可以不忽略标点符号呢? - saulotoledo
1
从PostgreSQL v10开始,PostgreSQL可以构建使用ICU库,这是来自UNICODE联盟的一个库,提供操作系统无关的排序。然后您可以使用CREATE COLLATION创建自己的PostgreSQL排序规则,我相信您可以构建一个实现此功能的排序规则。但是,您是否尝试在PostgreSQL中使用POSIX排序规则?也许这正是您想要的(而且您不必处理ICU排序规则)。 - Laurenz Albe
我会检查一下。目前我正在为一个由ORM管理的现有数据库创建一些测试,我只需要确保在排序后数据库和应用程序中具有相同的顺序(因为我在数据库之上有一些层)。但我一定会尝试POSIX。感谢您的所有帮助! :D - saulotoledo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接