我的一个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
答案 0 :(得分:1)
这里真正的问题是您的期望是否合理。 SQL中文本值的排序由排序规则确定。在PostgreSQL中,您可以在运行查询时更改排序规则。
select * from adv_names order by "name" collate "POSIX";
可以归结为:在哪些排序规则中,特殊字符在数字之前排序?我不认为任何排序规则都可以这样工作,但是我可能是错的。 (我在工作的地方不需要对整理工作进行过多考虑。)
要查看可用的归类,请运行此。
select * from pg_collation;
在紧要关头,您可以创建自己的排序规则。参见create collation。我不确定这是否适合您。这取决于操作系统支持和PostgreSQL构建选项。