gpt4 book ai didi

sql - 将连接与 ORDER BY 相结合

转载 作者:行者123 更新时间:2023-11-29 11:17:02 27 4
gpt4 key购买 nike

我在 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 字段中的特殊字符,以避免争用。

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


编辑

原来是拼接与问题无关。问题是 order by 简单地忽略了 '_' 字符。

最佳答案

select country1 || '_' || country2 collate "C" as a
from borders
order by 1

sql fiddle demo

根据评论中的讨论注释:

1.) COLLATE "C" 适用于 ORDER BY 子句,只要它引用 SELECT 子句中的表达式 < em>位置参数 或别名。如果您在 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.

关于sql - 将连接与 ORDER BY 相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18706562/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com