2

Ubuntu 12.04 と PG 9.1 を lc_collat​​e, lc_ctype = es_PE.UTF-8 でインストールしましたが、期待どおりに照合されません (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 はオペレーティング システムの照合順序を使用します。ただし、個別の値の順序がランダムになることはありません。照合に従って 2 つの文字列が等しい場合、基本的には C 照合をタイブレーカーとして使用します。

2 つの可能性があります。アクセントのない文字列で並べ替えるか、文字列列の連結で並べ替えることができます。

最初のオプションでは、次のようにデータベースに unaccent 機能をインストールする必要があります。

CREATE EXTENSION unaccent;

それが完了したら、これを実行できます:

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

2 番目のオプションでは、他に何もインストールする必要はありませんが、次のように実行できます。

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 に答える