1

varchar column [flat_number]はいくつかの値を持っている

A1A1A
A1A2A
A1A101A
A3A5A
12
A2
A3

結果を数値でソートし、次に文字でソートしたい

お気に入り

12
A2
A3
A1A1A
A1A2A
A1A101A
A3A5A

数字で並べ替えることができました(正規表現を使用して列に0〜9の数字しか含まれていない場合は、数字として扱います)、文字で並べ替えましたが、列の値がA1A101A(複数ある数字と文字の組み合わせ)

CASE
  WHEN length(flat_number) < 10 AND flat_number SIMILAR TO '[0-9]+'
THEN
  flat_number::int
END
ELSE
  NULL
END,
( SELECT COALESCE( match[1], NULL ) FROM regexp_matches( flat_number, '[^0-9]+' ) AS match ),
( SELECT COALESCE( left( match[1], 9), NULL ) FROM regexp_matches( flat_number, '([0-9]+$)' ) AS match )::int

現在のクエリは次のように機能します

列に数字[0-9]のみが含まれている場合は、intに変換してElSEに並べ替え、列を2つの部分に分割して、最初の列文字と最後の数字を抽出しようとします。

そうするためのより良い待機があり、また期待される出力が返されることを確認してください

4

1 に答える 1

0

私は次のことがうまくいくと思います:

order by (case when flat_number ~ '^[0-9]+$' then 0 else 1 end),
         (case when flat_number ~ '^[0-9]+$' then length(flat_number) end),
         flat_number

これは、最初に数字を並べ替え、トリックを使用してそれらを数字順に並べ、次に残りの数字を並べ替えます。

于 2013-02-15T20:01:54.610 に答える