このクエリの実行:
select name from folders order by name
これらの結果を返します:
alphanumeric
a test
test 20
test 19
test 1
test 10
しかし、私は期待していました:
a test
alphanumeric
test 1
test 10
test 19
test 20
ここで何が問題になっていますか?
このクエリの実行:
select name from folders order by name
これらの結果を返します:
alphanumeric
a test
test 20
test 19
test 1
test 10
しかし、私は期待していました:
a test
alphanumeric
test 1
test 10
test 19
test 20
ここで何が問題になっていますか?
name
列をデータ型にキャストするだけbytea
で、照合にとらわれない順序付けが可能になります。
SELECT name
FROM folders
ORDER BY name::bytea;
結果:
name
--------------
a test
alphanumeric
test 1
test 10
test 19
test 20
(6 rows)
この方法はすべて、選択内容をアルファベット順に並べ替えました。
test 1
test 10
test 2
test 20
この解決策は私にとってはうまくいきました(lc_collate: 'ru_RU.UTF8'):
SELECT name
FROM folders
ORDER BY SUBSTRING(name FROM '([0-9]+)')::BIGINT ASC, name;
test 1
test 2
test 10
test 20
次のように、末尾に数字がある場合は、テキストを分割して手動で並べ替えることができます。
SELECT * FROM sort_test
ORDER BY SUBSTRING(text FROM '^(.*?)( \\d+)?$'),
COALESCE(SUBSTRING(text FROM ' (\\d+)$')::INTEGER, 0);
これは、列テキストをソートします。最初にオプションで末尾のスペースを除くすべての文字、その後に数字、次にオプションの数字でソートします。
私のテストではうまくいきました。
更新により、文字列のみの並べ替えが単純な合体 (duh) で修正されました。
OverZealous の回答は役に立ちましたが、データベース内の文字列が数字で始まり、その後に追加の文字が続く場合は機能しませんでした。
以下は私のために働いた:
SELECT name
FROM folders
ORDER BY
COALESCE(SUBSTRING(name FROM '^(\\d+)')::INTEGER, 99999999),
SUBSTRING(name FROM '^\\d* *(.*?)( \\d+)?$'),
COALESCE(SUBSTRING(name FROM ' (\\d+)$')::INTEGER, 0),
name;
だからこれ:
Tor の最後の SQL はうまくいきました。ただし、このコードを php から呼び出す場合は、スラッシュを追加する必要があります。
SELECT name
FROM folders
ORDER BY
COALESCE(SUBSTRING(name FROM '^(\\\\d+)')::INTEGER, 99999999),
SUBSTRING(name FROM '^\\\\d* *(.*?)( \\\\d+)?$'),
COALESCE(SUBSTRING(name FROM ' (\\\\d+)$')::INTEGER, 0),
name;