sql - 如何在 PostgreSQL 中以正确的顺序返回记录

标签 sql postgresql sql-order-by locale collation

查询

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/

相关文章:

MySQL:将数据从表复制到另一个

mysql - 为什么我使用这些 HQL 查询得不到任何数据?

MySQL 添加一个 NOT NULL 列

postgresql - 使用具有相同 Flask-SQLAlchemy 模型的多个 POSTGRES 数据库和模式

sql - 常用查询的 psql 快捷方式? (比如 Unix "alias")

php - mysql按值排序,合并列

mysql - 触发错误

postgresql - 如何找到消耗最多 I/O 的 postgresql 查询

python - 如何以数字方式订购 Django QuerySet 字符串属性?

mysql - SQL - 每个日期一条记录