9

我在 Postgre (9.1.9) 中将串联与 order by 相结合时遇到了麻烦。假设,我有一个包含 3 个字段的表格边框:

            Table "borders"
    Column     |         Type         | Modifiers 
---------------+----------------------+-----------
 country1      | character varying(4) | not null
 country2      | character varying(4) | not null
 length        | numeric              | 

前两个字段是国家代码,第三个字段是这些国家之间的边界长度。
主键在前两个字段上定义。

我需要组成一个对整个表具有唯一值的列的选择,此外,该列应按降序选择。为此,我将关键字段与分隔符连接起来,否则两个不同的行可能会给出相同的结果,例如(AB,C 和 A,BC)。

所以我运行以下查询:

select  country1||'_'||country2 from borders order by 1;

但是在结果中,我看到排序中省略了“_”字符。结果如下所示:

 ?column? 
----------
 A_CH
 A_CZ
 A_D
 AFG_IR
 AFG_PK
 AFG_TAD
 AFG_TJ
 AFG_TM
 AFG_UZB
 A_FL
 A_H
 A_I
 .
 .

您可以看到结果被排序,就好像字符串中不存在“_”一样。

如果我使用字母(比如“x”)作为分隔符 - 顺序是正确的。但是我必须使用一些没有出现在 country1 和 country2 字段中的特殊字符,以避免争用。

我应该怎么做,以便在排序过程中考虑到“_”字符。


编辑

事实证明,串联与问题无关。问题是顺序只是忽略了“_”字符。

4

3 回答 3

8

只需按两列排序:

SELECT  country1||'_'||country2 FROM borders ORDER BY country1, country2;

除非您使用聚合或窗口,否则即使您未将它们包含在 SELECT 列表中,PostgreSQL 也允许按列排序。

正如另一个答案中所建议的,您还可以更改组合列的排序规则,但是如果可以的话,对普通列进行排序会更快,特别是如果您对它们有索引。

于 2013-09-09T20:44:18.513 回答
7
select country1 || '_' || country2 collate "C" as a
from borders
order by 1

sql fiddle demo

根据评论中的讨论注意事项:

1.)COLLATE "C"适用于ORDER BY子句,只要它SELECT通过位置参数别名引用子句中的表达式。如果您重复其中的表达式,如果您想相应地影响排序顺序,ORDER BY您还需要重复该子句。COLLATE

sql fiddle demo

2.)在_不影响排序顺序的排序规则中,使用雾的查询更有效,因为它利用了现有的索引(primary key is defined on the first two fields)。
但是,如果_有影响,则需要对组合表达式进行排序:

sql fiddle demo

查询性能(在 Postgres 9.2 中测试):
sql fiddle demo

手册中的 PostgreSQL 排序规则支持。

于 2013-09-09T20:44:49.597 回答
1

当您执行以下操作时会发生什么?

 select  country1||'_'||country2 from borders order by country1||'_'||country2

我对按 1 排序的知识仅进行序数排序。它不会对连接的列执行任何操作。当然,我说的是 SQL Server 知识,所以如果我偏离了基础,请告诉我。

编辑:好的;当我发布我的帖子时,刚刚看到了帕拉多的帖子。也许您可以从此查询创建一个视图(给它一个列名),然后重新查询该视图,按该列排序?或执行以下操作:

select country_group from (
    select  country1||'_'||country2 as country_group from borders
    ) a
order by country_group
于 2013-09-09T20:40:28.907 回答