私のPostgreSQLはあなたが望むようにソートします。 PostgreSQLが文字列を比較する方法は、ロケールと照合によって決まります。 createdb
を使用してデータベースを作成する場合 -l
があります ロケールを設定するオプション。また、 psql -l </ code>を使用して、環境でどのように構成されているかを確認できます。 :
[[email protected]]$ psql -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------+----------+----------+------------+------------+-----------------------
mn_test | postgres | UTF8 | pl_PL.UTF8 | pl_PL.UTF8 |
ご覧のとおり、私のデータベースはポーランドの照合を使用しています。
他の照合を使用してデータベースを作成した場合は、次のようにクエリで他の照合を使用できます。
SELECT * FROM sort_test ORDER BY name COLLATE "C";
SELECT * FROM sort_test ORDER BY name COLLATE "default";
SELECT * FROM sort_test ORDER BY name COLLATE "pl_PL";
次の方法で利用可能な照合を一覧表示できます:
SELECT * FROM pg_collation;
編集:
ああ、「a11」が「a2」の前にあるに違いないことを見逃しました。
標準の照合で英数字の並べ替えを解決できるとは思いません。このような並べ替えでは、Clodoaldo Netoの応答と同様に、文字列をパーツに分割する必要があります。この方法で頻繁に注文する必要がある場合に役立つもう1つのオプションは、名前フィールドを2つの列に分割することです。 name
を分割するトリガーをINSERTとUPDATEで作成できます name_1
に およびname_2
そして:
SELECT name FROM sort_test ORDER BY name_1 COLLATE "en_EN", name_2;
(照合をポーランド語から英語に変更しました。ネイティブの照合を使用して、aącćなどの文字を並べ替える必要があります)