在Postgresql 9.1中更正整理

时间:2012-05-10 21:14:39

标签: postgresql collation postgresql-9.1

我已经使用lc_collat​​e,lc_ctype = es_PE.UTF-8安装了Ubuntu 12.04和PG 9.1,但它没有按预期进行整理(u =ü=ú= U =Ú=Ü)。

如果我:

CREATE TABLE testing (id integer PRIMARY KEY, dad text, mum text, name text);
INSERT INTO testing VALUES
  (1, 'león','valencia', 'josé'),
  (2, 'leon', 'mendoza', 'juan'),
  (3, 'león', 'valárd', 'jose'),
  (4, 'león','válencia', 'jos'),
  (5, 'león', 'mendoza', 'jua'),
  (6, 'leon', 'valencia', 'josie'),
  (7, 'león', 'valencia', 'josie'),
  (8, 'leo','zara', 'juan'),
  (9, 'león','Valencia', 'jos');
SELECT * FROM testing ORDER BY dad, mum, name;

然后我获得:

 id | dad  |   mum    | name
----+------+----------+-------
  8 | leo  | zara     | juan
  2 | leon | mendoza  | juan
  6 | leon | valencia | josie
  5 | león | mendoza  | jua
  3 | león | valárd   | jose
  1 | león | valencia | josé
  7 | león | valencia | josie
  9 | león | Valencia | jos
  4 | león | válencia | jos
(9 rows)

如何配置它以获取:

 id | dad  |   mum    | name
----+------+----------+-------
  8 | leo  | zara     | juan
  5 | león | mendoza  | jua
  2 | leon | mendoza  | juan
  3 | león | valárd   | jose
  9 | león | Valencia | jos
  4 | león | válencia | jos
  1 | león | valencia | josé
  7 | león | valencia | josie
  6 | leon | valencia | josie
(9 rows)

这在MySQL中完成没有任何问题。但是我无法在PG 9.1中配置它

提前致谢...

1 个答案:

答案 0 :(得分:2)

PostgreSQL使用操作系统的排序规则;但是,它永远不会使不同值的排序随机 - 如果两个字符串根据排序规则相等,它基本上会回到C排序规则作为打破平局。

你有两个可能性:你可以对没有重音的字符串进行排序,或者你可以对字符串列的串联进行排序。

对于第一个选项,您需要在数据库中安装unaccent功能,如下所示:

CREATE EXTENSION unaccent;

完成后,你可以运行:

SELECT * FROM testing ORDER BY unaccent(dad), unaccent(mum), unaccent(name);

对于第二个选项,您不需要安装任何其他选项,但您可以运行以下内容:

SELECT * FROM testing ORDER BY dad || ', ' || mum || ' ' || name;

在我们的商店,我们做了类似的事情,但我们使用“生成的列”来确保一致性。这些方面的东西:

CREATE FUNCTION search_name(rec testing)
  RETURNS text
  LANGUAGE SQL
AS $$ SELECT $1.dad || ', ' || $1.mum || ' ' || $1.name; $$;

这允许更简单的选择:

SELECT * FROM testing t ORDER BY t.search_name;