在Postgres中使用变音符号进行排序

时间:2016-02-25 14:01:15

标签: postgresql sql-order-by diacritics

我需要从表中选择数据并使用ORDER BY子句对它们进行排序。 问题是该列包含带有捷克变音符号的文本数据。 我不能使用COLLATE,因为DB是使用lc_collat​​e = en_US.UTF-8创建的postgres集群的一部分,我无法承受因使用正确的lc_collat​​e重新创建集群而导致的停机时间。

示例数据:

CREATE TABLE test (
  id serial PRIMARY key,
  name text
);

INSERT INTO test (name) VALUES ('Žoo'), ('Zoo'), ('ŽOO'), ('ZOO'),
  ('ŽoA'), ('ŽóA'), ('ŽoÁ'), ('ŽóÁ');

理想输出:

SELECT * FROM test ORDER BY name COLLATE "cs_CZ.utf8";
id | name
----+------
  2 | Zoo
  4 | ZOO
  5 | ŽoA
  7 | ŽoÁ
  6 | ŽóA
  8 | ŽóÁ
  1 | Žoo
  3 | ŽOO
(8 rows)

Here我找到了一种解决方案:

SELECT * FROM test ORDER BY name USING ~<~;
id | name
----+------
  4 | ZOO
  2 | Zoo
  3 | ŽOO
  5 | ŽoA
  1 | Žoo
  7 | ŽoÁ
  6 | ŽóA
  8 | ŽóÁ
(8 rows)

结果足够接近(供我使用) - 卡通信件是非卡车后的。

我对~<~运算符

的稍微偏离主题的Postgresql anabasis

修改:转为new question

回到问题:除了使用正确的区域设置重新创建postgres群集之外,还有其他解决方案可以获得理想的顺序吗?

~<~运营商的一些关注也很好。

3 个答案:

答案 0 :(得分:0)

我不确定我是否理解这个问题,因为看起来你已经找到了解决方案。我可以建议的唯一想法是,您可以使用正确的整理

添加新字段czechName

http://www.postgresql.org/docs/current/static/sql-altertable.html

ADD [ COLUMN ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]

答案 1 :(得分:0)

与Juan Carlos Oropeza建议的类似,您可以尝试使用以下方法更改列的排序规则:

ALTER TABLE test ALTER COLUMN "name" TYPE text COLLATE 'cs_CZ.utf8';

参考:http://www.postgresql.org/docs/current/static/sql-altertable.html

答案 2 :(得分:0)

正如@Igor在他的评论中指出的那样,没有必要使用不同的 lc_collat​​e 重新创建postgres集群并处理导致的停机时间。

解决问题的确切步骤是:

  1. cs_CZ.UTF-8 UTF-8

  2. 中添加/取消注释第/etc/locale.gen
  3. 生成新的区域设置:

    # locale-gen

  4. 在postgres中定义新的排序规则:

    CREATE COLLATION "cs_CZ.utf8" ( locale = 'cs_CZ.UTF-8' );