18

このクエリの実行:

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

ここで何が問題になっていますか?

4

7 に答える 7

27

name列をデータ型にキャストするだけbyteaで、照合にとらわれない順序付けが可能になります。

SELECT name
FROM folders
ORDER BY name::bytea;

結果:

     name     
--------------
 a test
 alphanumeric
 test 1
 test 10
 test 19
 test 20
(6 rows)
于 2011-08-10T23:17:37.723 に答える
15

この方法はすべて、選択内容をアルファベット順に並べ替えました。

test 1
test 10
test 2
test 20

この解決策は私にとってはうまくいきました(lc_collat​​e: '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
于 2015-09-04T06:49:52.430 に答える
8

次のように、末尾に数字がある場合は、テキストを分割して手動で並べ替えることができます。

SELECT * FROM sort_test
ORDER BY SUBSTRING(text FROM '^(.*?)( \\d+)?$'),
         COALESCE(SUBSTRING(text FROM ' (\\d+)$')::INTEGER, 0);

これは、列テキストをソートします。最初にオプションで末尾のスペースを除くすべての文字、その後に数字、次にオプションの数字でソートします。

私のテストではうまくいきました。

更新により、文字列のみの並べ替えが単純な合体 (duh) で修正されました。

于 2011-08-10T23:04:27.617 に答える
4

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;

だからこれ:

  1. 文字列の最初の数値を抽出するか、99999999 を使用します。
  2. 可能な最初の数字に続く文字列を抽出します。
  3. 末尾の数字を抽出するか、0 を使用します。
于 2012-02-28T13:33:16.253 に答える
1

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;
于 2014-03-11T16:47:32.253 に答える