查询
select 'T' union all select 'Z' order by 1
返回
Z
T
但正确的顺序应该是
T
Z
在 3 种不同的操作系统中尝试过
- Windows 2003 服务器“PostgreSQL 9.1.3,由 Visual C++ build 1500 编译,32 位”
- Windows 7“PostgreSQL 9.2.1,由 Visual C++ build 1600 编译,32 位”
- Debian “x86_64-unknown-linux-gnu 上的 PostgreSQL 9.1.2,由 gcc-4.4.real (Debian 4.4.5-8) 4.4.5 编译,64 位”
数据库设置为:
Collation: et_EE.UTF-8
Character type: et_EE.UTF-8
如何解决这个问题?
更新
数据库是使用创建的
CREATE DATABASE mydb WITH TEMPLATE=template0 OWNER=mydb_owner ENCODING='UNICODE'
在所有情况下,操作系统区域设置都是爱沙尼亚语,因此数据库是在爱沙尼亚语区域设置中创建的。
select 'Z' collate "et_EE" union all select 'S' collate "et_EE" order by 1
返回正确的顺序:
S
Z
但是
select 'Z' collate "et_EE" union all select 'T' collate "et_EE" order by 1
如答案中所述返回无效订单:
Z
T
最佳答案
原始 SQL 没有任何问题。
它似乎没有按照您期望的方式工作的原因是因为您使用爱沙尼亚语言环境,但是 Estonian collation rules要求“Z”位于“T”之前。
您可以使用不同的排序规则或在 en_US.UTF-8 语言环境中创建数据库。
关于sql - 如何在 PostgreSQL 中以正确的顺序返回记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13895225/