sql >> データベース >  >> RDS >> PostgreSQL

postgresでの英数字の大文字と小文字を区別しない並べ替え

    私の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ćなどの文字を並べ替える必要があります)



    1. 数学関数PL/SQLを解決する

    2. アイテム更新のmysql結果を取得する

    3. MySQL 8のmy.cnfでsql_modeを設定するにはどうすればよいですか?

    4. 列1のサブ文字列に別の列の値が含まれているかどうかを確認するSQLクエリ