Postgresql专家您好,
被order by
的postgresql所卡住,因为数据是如此敏感地粘贴在pgAdmin的此处。
如您在图像中所见,“ 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");
预先感谢您的帮助!
答案 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
没有考虑句点或空格,而是直接转到下一个可用字母。我能想到的最干净的方法是:
name
分为三列:第一列,中间列和最后列。