在mac上使用postgresql,我正在尝试以降序排序名称,但我注意到这两个名字是否具有相同的第一个字母,在尝试订购时不会检查第二个字母。
例如,假设您有以下字符串:
Amen, Alia, Atis,...etc
理想情况下,它们应按顺序排列:
Alia, Amen, Atis,..etc
但postgresql只检查第一个字母,似乎没有检查整个字符串。因此postgresql返回的名称顺序为:
Atis, Alia, Amen,..etc
或只是一些随机顺序。我已将数据库排序规则设置为en_us.utf8。
我正在尝试使用的简化查询是:
SELECT name
FROM properties
ORDER BY name;
如何通过整个字符串制作postgresql顺序,这可能吗?
更新: 当我在pgadmin III中尝试查询时,我发现它会产生相同的结果,我认为它可能与postgreSQL的配置有关。
我的db配置是: 排序规则和字符类型为:en_CA.UTF-8 tablespace:pg_default
我在mac上设置的配置有问题吗?
答案 0 :(得分:1)
我的猜测是您遇到排序规则和/或不可打印字符的问题。
您可以根据http://www.postgresql.org/docs/9.1/static/collation.html尝试不同的排序规则:
SELECT name COLLATE "C", name::bytea FROM properties
LEFT OUTER JOIN observations on properties.id =observations.id order by 1 desc;
您将能够尝试整理(第一列)并查看name
(第二列)中存储的确切内容(十六进制二进制值)。
编辑:找到this Postgres.app issue后,我非常有信心您在OSX排序规则支持中遇到了错误。要确认,您可以尝试使用sort
在控制台中对相同的文本进行排序。
我不知道此时是否存在变通方法,但PGDG is aware of the problem如果一切顺利,PostgreSQL 9.6 might solve your problem。
答案 1 :(得分:0)
Natural order sort
这就是你要找的东西。
CREATE FUNCTION btrsort_nextunit(text) RETURNS text AS $$
SELECT CASE WHEN $1 ~ '[^0-9]+' THEN
COALESCE( SUBSTR( $1, LENGTH(SUBSTRING($1 FROM '[^0-9]+'))+1 ),
'' )
ELSE
COALESCE( SUBSTR( $1, LENGTH(SUBSTRING($1 FROM '[0-9]+'))+1 ),
'' )
END
$$ LANGUAGE SQL;
CREATE FUNCTION btrsort(text, integer) RETURNS text AS $$
SELECT CASE WHEN $2-1>0
THEN
RPAD(SUBSTR(COALESCE(SUBSTRING($1 FROM '^[^0-9]+'), ''), 1, 12), 12, ' ') ||
LPAD(SUBSTR(COALESCE(SUBSTRING(btrsort_nextunit($1) FROM '^[0-9]+'), ''), 1, 12), 12, 0) || btrsort(btrsort_nextunit(btrsort_nextunit($1)), $2-1)
ELSE
RPAD(SUBSTR(COALESCE(SUBSTRING($1 FROM '^[^0-9]+'), ''), 1, 12), 12, ' ') ||
LPAD(SUBSTR(COALESCE(SUBSTRING(btrsort_nextunit($1) FROM '^[0-9]+'), ''), 1, 12), 12, 0)
END
;
$$ LANGUAGE SQL;
CREATE FUNCTION btrsort(text) RETURNS text AS $$
SELECT btrsort($1, 10);
$$ LANGUAGE SQL;
SELECT room_number
FROM (SELECT room_number, btrsort(room_number) AS room_sort
FROM rooms
ORDER BY room_sort) AS foo
room_number
-----------
8
9
9a
10
http://www.postgresql.org/docs/8.0/interactive/queries-order.html http://2kan.tumblr.com/post/361326656/postgres-natural-ordering