1

データベースにいくつかの文字列があります。それらのいくつかは数値を持っています(ただし、もちろん文字列形式です)。これらの値を昇順に表示しています。

したがって、文字列値の場合、たとえば 10 は 2 より大きいことがわかりますが、これは正常です。コードやデータベース構造を変更せずに、データのみを変更せずに、2 の後に 10 を表示する解決策があるかどうかを尋ねています。

たとえば、1 から 10 までの値を表示する必要がある場合は、次のようになります。

  • 1
  • 10
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

私がしたいのは

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

「9 より大きいと解釈される非表示の文字または文字列」を広告する可能性はありますか。10 の代わりに a10 を入力すると、a10 が最後になりますが、そのために見えない、または目立たない文字はありますか。

繰り返しますが、私はプログラミングやデータベース構造の解決策を探しているのではなく、単純な回避策を探しています。

4

3 に答える 3

2

値を数値としてキャストして、それで並べ替えることができます。

select col
from yourtable
order by cast(col AS UNSIGNED)

デモ付きのSQLフィドルを参照してください

于 2013-01-10T10:56:29.590 に答える
1

データの先頭に正しい数のゼロを追加してみてください。

01
02
03
..
10
11
..
99
于 2013-01-10T10:51:16.420 に答える
0

この列には数字と文字が混在しているため (1 行でなくても)、実際に実行しようとしているのは自然な並べ替えです。これは、MySQL がネイティブにできることではありません。ただし、いくつかの回避策があります。私が遭遇した最高のものは次のとおりです。

  1. 長さ、値の順で並べ替えます。

    SELECT mixedColumn FROM tableName ORDER BY LENGTH(mixedColumn), mixedColumn;

    その他の例については、http: //www.copterlabs.com/blog/natural-sorting-in-mysql/を参照してください。

  2. ある種の正規化されたデータ (つまり、数字のみまたは文字のみ) を含むソート キーとして使用するセカンダリ列を使用します。

    CREATE TABLE tableName (mixedColumn varchar, sortColumn int); INSERT INTO tableName VALUES ('1',1), ('2',2), ('10',3), ('a',4),('a1',5),('a2',6 ),('b1',7);

    SELECT mixedColumn FROM tableName ORDER BY sortColumn;

    順序を処理する適切な方法を見つけられない限り、これを維持するのが難しくなる可能性があります。

もちろん、データベースの外に出ることができれば、さまざまなプログラミング言語の自然な並べ替え機能を使用できます。

于 2013-01-11T04:29:19.773 に答える