sql – 将串联与ORDER BY结合使用

前端之家收集整理的这篇文章主要介绍了sql – 将串联与ORDER BY结合使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在Postgre(9.1.9)中将连接与顺序结合起来遇到了麻烦.
比方说,我有一个包含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

sql fiddle demo

根据评论中的讨论说明:

1.)COLLATE“C”适用于ORDER BY子句,只要它通过位置参数或别名引用SELECT子句中的表达式即可.如果在ORDER BY中重复表达式,则还需要重复COLLATE子句,以便相应地影响排序顺序.

sql fiddle demo

2.)在_不影响排序顺序的排序规则中,使用fog’s query更有效,更是如此,因为它使用现有索引(主键在前两个字段中定义).
但是,如果_有影响,则需要对组合表达式进行排序:

sql fiddle demo

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

PostgreSQL Collation Support in the manual.

猜你在找的MsSQL相关文章