【问题标题】:Postgresql - Sort a character field with Special characters, numbers and alphabetsPostgresql - 使用特殊字符、数字和字母对字符字段进行排序
【发布时间】:2023-03-06 03:56:01
【问题描述】:

我的一张 Postgresql 表中有以下数据。

name
-----------------
AdvertiserTest123  
Advertiser ADV 833  
:1Advertiser  
02 Advertiser  
MH Advertiser

当我查询为:Select * from adv_names order by name;

我得到的输出是

AdvertiserTest123  
Advertiser ADV 833  
:1Advertiser  
02 Advertiser  
MH Advertiser  

我希望排序顺序是名称,特殊字符后跟数字,然后是字母。如果我没记错的话,这就是它在 Sql Server 中的行为方式。

我尝试更改排序规则并尝试 ascii 搜索。它不像我期望的那样工作。有人可以帮忙吗?

预期输出:

:1Advertiser  
02 Advertiser  
Advertiser ADV 833  
AdvertiserTest123  
MH Advertiser

【问题讨论】:

    标签: database postgresql sorting sql-order-by


    【解决方案1】:

    这里真正的问题是您的期望是否合理。 SQL 中的文本值排序由排序规则决定。在 PostgreSQL 中,您可以在运行查询时更改排序规则。

    select * from adv_names order by "name" collate "POSIX";
    

    归结为:在哪些排序规则中,特殊字符是在数字之前排序的?我不认为任何排序规则都是这样工作的,但我可能是错的。 (我不必考虑我工作的排序规则。)

    要查看您可以使用哪些排序规则,请运行此命令。

    select * from pg_collation;
    

    在紧要关头,您可以创建自己的排序规则。见create collation。我不确定这是否适合你。这取决于操作系统支持和 PostgreSQL 构建选项。

    【讨论】:

    • 它确实提供了一个方向。关于我的期望..基本上我有 2 个来源来提取我的报告。一个是基于 sql server 的,另一个是 Postgres。 Sql Server 根据我的期望返回输出,因此我正在尝试在 Postgres 中做类似的事情。
    • 首先,找出 SQL Server 使用的排序规则。您可能还需要确定其字符编码。然后尝试找出 Linux 上的哪个联盟做同样的事情。 (我假设 postgres SQL 在 Linux 上运行。)
    • 是的,Postgres 在 Linux 中。谢谢 。我会继续发布的
    • 更新是从 SQL 服务器到 Postgres SQL 没有精确的排序规则匹配,它根据我的要求进行排序。对于我的问题,我做了一个客户端排序,它也有一些限制,但我现在可以接受。您的答案适用于该问题。所以我会把它标记为正确答案。感谢您的帮助。
    猜你喜欢
    • 2020-11-13
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多