Postgresql Order by无法正常工作

时间:2019-06-26 18:49:52

标签: postgresql

Postgresql专家您好,

order by的postgresql所卡住,因为数据是如此敏感地粘贴在pgAdmin的此处。

enter image description here

如您在图像中所见,“ Les”排在第一位,“ L”排在第一位。来了。其实是“ L”应该首先出现,然后是“ Les”。 “L。”也分成几列,但未排序。所以知道为什么会这样吗?

这是表(名称列)的定义:

CREATE TABLE public.res_partner
(
  id integer NOT NULL DEFAULT nextval('res_partner_id_seq'::regclass),
  name character varying,
  .....
  .....

这是为此表的名称列创建的索引。

CREATE INDEX res_partner_name_index
  ON public.res_partner
  USING btree
  (name COLLATE pg_catalog."default");

预先感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

PostgreSQL使用操作系统中的库来支持本地语言。当您使用不带ORDER BY子句的COLLATE子句时,则Postgres使用默认排序规则-您可以通过命令SHOW lc_collate显示它。索引对于加快ORDER BY子句很重要。它不会影响订购。某些语言环境可以使用与您预期不同的顺序。

您可以查看结果:

SELECT datname, datcollate FROM pg_database;

如果期望使用不同的语言环境,则a)在COLLATE clause之后使用ORDER BY,b)通过转储/装入来使用不同的语言环境重新创建数据库。

答案 1 :(得分:4)

我认为您可以通过使用其他排序规则来解决此问题:

ORDER BY name COLLATE "C"

如果您希望索引支持此查询,请使用相同的排序规则对其进行定义。

答案 2 :(得分:0)

查看您的图像,看来ORDER BY没有考虑句点或空格,而是直接转到下一个可用字母。我能想到的最干净的方法是:

  1. name分为三列:第一列,中间列和最后列。
  2. 去除所有句点和空格。
  3. 按先后顺序排列。