【问题标题】:What is the best way to replicate PostgreSQL sorting results in JavaScript?在 JavaScript 中复制 PostgreSQL 排序结果的最佳方法是什么?
【发布时间】:2020-06-22 23:55:18
【问题描述】:

我正在尝试复制 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),所以我可以在我的测试中验证它。我相信我在这里遗漏了一些非常简单的东西。任何帮助表示赞赏。

我可以尝试使用 this one 之类的函数来强制 PostgreSQL 中的顺序,但我不希望这样。我的目标是复制 JavaScript 中的默认行为。

【问题讨论】:

    标签: javascript postgresql


    【解决方案1】:

    总是使用特定的排序规则对字符串进行排序。如果您不知道在您的编程语言中使用排序规则,您可能正在使用POSIX 排序规则,它根据字符串的代码点(编码中的数值)逐个字符地比较字符串.

    在 PostgreSQL 中,它看起来像这样:

    ORDER BY name COLLATE "POSIX";
    

    因此,要解决您的问题,您必须找出列的排序规则。

    如果列定义中没有指定特殊的排序规则,则使用数据库的排序规则,可以用

    SELECT datcollate FROM pg_database WHERE datname = 'my_database';
    

    这将是来自 C 库的操作系统排序规则。

    所以您所要做的就是在您的程序中使用该排序规则。

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

    【讨论】:

    • 感谢您的解释。一个小问题:我使用了相同的排序规则,但我设法通过忽略比较中的标点符号来使其工作(例如["dolores et", "dolor nemo", 'abc' , 'zxc'].sort((a,b) => a.localeCompare(b, 'en-us', {ignorePunctuation: true})))。是否可以让PostgreSQL不忽略标点符号?
    • 从 PostgreSQL v10 开始,可以使用 ICU 库构建 PostgreSQL,该库来自 UNICODE 联盟,提供独立于操作系统的排序规则。然后您可以使用CREATE COLLATION 创建您自己的 PostgreSQL 排序规则,我相信您可以构建一个这样做的。但是您是否尝试在 PostgreSQL 中使用 POSIX 排序规则?也许这正是您想要的(任何您不必弄乱 ICU 排序规则的东西)。
    • 我会检查的。现在我正在为一个由 ORM 管理的现有数据库创建一些测试,我只需要确保在排序之后我在数据库中和在应用程序中具有相同的顺序(因为我在数据库顶部有一些层)。但我肯定会尝试 POSIX。感谢你的帮助! :D
    猜你喜欢
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2010-10-29
    • 1970-01-01
    • 2011-12-09
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多