postcresql命令由desc为字符串不起作用

时间:2015-11-18 17:55:43

标签: java postgresql

在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上设置的配置有问题吗?

2 个答案:

答案 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这就是你要找的东西。

PSQL函数

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