设置Order By以忽略每列的标点符号

tuf*_*der 1 postgresql collation sql-order-by postgresql-9.1

是否可以通过包含类似字符的标题字段来命令PostgreSQL查询的结果,[](),;但这样做是否忽略这些标点字符并仅按文本字符排序?

我已经阅读了有关更改数据库排序规则或区域设置的文章,但没有找到关于如何在每个列的现有数据库上执行此操作的任何明确说明.这甚至可能吗?

Erw*_*ter 5

用于排序的"标准化"

可以使用子句中regexp_replace()的模式'[^a-zA-Z]',ORDER BY但只能识别纯ASCII字母.更好地使用类缩写'\W'识别你的语言环境中的其他非ASCII字母等äüóèß.或者你可以unaccent()函数的帮助下即兴创作并"将带有变音元素的所有字符规范化为它们的基本形式.考虑这个小小的演示:

SELECT *
      , regexp_replace(x, '[^a-zA-Z]', '', 'g')
      , regexp_replace(x, '\W', '', 'g')
      , regexp_replace(unaccent(x), '\W', '', 'g')
FROM  (
SELECT 'XY ÖÜÄöüä????€????????????????Šš???Žž?‘´’„“”­–—[](),;.:?? XY'::text AS x) t
Run Code Online (Sandbox Code Playgroud)

- > Postfres 9.2的SQLfiddle.
- > Postfres 9.1的SQLfiddle.

正则表达式代码已在9.2版中更新.我假设这是9.2中改进处理的原因,其中示例中的所有字母字符都匹配,而9.1只匹配一些.

unaccent()由附加模块unaccent提供.跑:

CREATE EXTENSION unaccent;
Run Code Online (Sandbox Code Playgroud)

每个数据库使用一次(Postgres 9.1+,旧版本使用不同的技术).

locales/collat​​ion

您必须意识到Postgres依赖于语言环境的底层操作系统(包括整理).排序顺序由您选择的区域设置决定,或更具体LC_COLLATE.更多相关答案:
字符串排序顺序(LC_COLLATE和LC_CTYPE)

计划直接将整理支持纳入Postgres,但目前尚未提供.

许多语言环境忽略了您描述的用于对字符数据进行排序的特殊字符.如果系统中安装了提供所需排序顺序的语言环境,则可以在Postgres 9.1或更高版本中临时使用它:

SELECT foo FROM bar ORDER BY foo COLLATE "xy_XY"
Run Code Online (Sandbox Code Playgroud)

要查看当前Postgres安装中已安装和可用的排序规则,请执行以下操作:

SELECT * FROM pg_collation;
Run Code Online (Sandbox Code Playgroud)

不幸的是,除非您破解源代码,否则无法定义您自己的自定义排序规则.

整理规则通常由一个国家所说的语言规则来管理.电话簿的排序顺序,如果还有电话簿......你的操作系统提供它们.

例如,在Debian Linux中你可以使用:

locale -a
Run Code Online (Sandbox Code Playgroud)

显示所有生成的区域设置.和:

dpkg-reconfigure locales
Run Code Online (Sandbox Code Playgroud)

以root用户(多种方式)生成/安装更多.