2

询问

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
4

3 回答 3

3

原始 SQL 没有任何问题。

它似乎没有按您期望的方式工作的原因是因为您使用爱沙尼亚语语言环境,但爱沙尼亚语排序规则要求“Z”在“T”之前。

您可以使用不同的排序规则或在 en_US.UTF-8 语言环境中创建数据库。

于 2012-12-15T19:05:54.220 回答
2

查询没有任何问题。

一个UNION [ALL](或INTERSECTEXCEPT)查询被认为是一个查询。ORDER BY适用于所有腿的联合,而不仅仅是最后一条。您必须使用括号来使ORDER BY查询的一个分支成为局部变量。在这里引用手册:

select_statement UNION [ ALL | DISTINCT ] select_statement

select_statement是任何SELECT没有ORDER BY, LIMIT, FOR UPDATE, orFOR SHARE子句的语句。(ORDER BY并且LIMIT可以附加到一个子表达式,如果它被括在括号中。没有括号,这些子句将被应用到 的结果,而 UNION不是它的右手输入表达式。)

这只是工作(a排序之前b):

SELECT 'b'
UNION ALL
SELECT 'a'
ORDER BY 1

与问题中的原始查询一样:

SELECT 'T' 
UNION ALL
SELECT 'Z'
ORDER BY 1

要检查您的排序规则:

SHOW lc_collate;

et_EE.UTF-8是爱沙尼亚语语言环境,Z爱沙尼亚语字母表T中排在前面。就这样。

整理没有任何问题。

于 2012-12-15T23:33:56.197 回答
-1

问题是排序规则:

select 'T' collate "et_EE.utf8" a union all select 'Z' collate "et_EE.utf8" order by 1;
 a 
---
 Z
 T

使用en_US排序规则时,它可以工作:

select 'T' collate "en_US.utf8" a union all select 'Z' collate "en_US.utf8" order by 1;
 a 
---
 T
 Z
于 2012-12-15T19:33:39.813 回答