2

我已经使用 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 中配置它

提前致谢...

4

1 回答 1

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;
于 2012-05-10T22:15:00.047 回答