並べ替えのための「正規化」
あなたはできた 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
->Postgres9.2用のSQLfiddle。
-> SQLfiddle forPostgres9.1。
正規表現コードはバージョン9.2で更新されました。私は仮定 これが、例のすべての文字が一致する9.2で処理が改善された理由ですが、9.1は一部のみが一致します。
unaccent()
追加モジュール
CREATE EXTENSION unaccent;
使用するデータベースごとに1回(Postgres 9.1以降、古いバージョンでは別のテクニック 。
ロケール/照合
Postgresはロケール(照合を含む)を基盤となるオペレーティングシステムに依存していることに注意する必要があります。並べ替え順序は、選択したロケール、またはより具体的なLC_COLLATE
。この関連する回答の詳細:
文字列の並べ替え順序(LC_COLLATEおよびLC_CTYPE)
照合サポートをPostgresに直接組み込む計画があります 、ただし、現時点ではご利用いただけません。
多くのロケールは、箱から出して文字データをソートするために記述した特殊文字を無視します。探している並べ替え順序を提供するロケールがシステムにインストールされている場合は、Postgres9.1以降でアドホックに使用できます。
SELECT foo FROM bar ORDER BY foo COLLATE "xy_XY"
現在のPostgresインストールでインストールされて利用可能な照合を確認するには:
SELECT * FROM pg_collation;
残念ながら、ソースコードをハックしない限り、独自のカスタム照合を(まだ)定義することはできません。
照合規則は通常、国で話されている言語の規則によって管理されます。電話帳がまだある場合は、電話帳の並べ替え順序になります...オペレーティングシステムがそれらを提供します。
たとえば、DebianLinuxでは次のものを使用できます。
locale -a
生成されたすべてのロケールを表示します。そして:
dpkg-reconfigure locales
rootユーザーとして(複数の方法の1つ)、さらに生成/インストールします。