我在Postgre(9.1.9)中将连接与顺序结合起来遇到了麻烦.
比方说,我有一个包含3个字段的表格边框:
比方说,我有一个包含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字段中的特殊字符,以避免争用.
我应该怎么做,以便在排序过程中考虑’_’字符.
编辑
事实证明,连接与问题无关.问题是订单只是忽略’_’字符.
解决方法
select country1 || '_' || country2 collate "C" as a from borders order by 1
根据评论中的讨论说明:
1.)COLLATE“C”适用于ORDER BY子句,只要它通过位置参数或别名引用SELECT子句中的表达式即可.如果在ORDER BY中重复表达式,则还需要重复COLLATE子句,以便相应地影响排序顺序.
2.)在_不影响排序顺序的排序规则中,使用fog’s query更有效,更是如此,因为它使用现有索引(主键在前两个字段中定义).
但是,如果_有影响,则需要对组合表达式进行排序:
查询性能(在Postgres 9.2中测试):
sql fiddle demo