0

SQL に次のデータがあります。

name       ID  
 A[0]       1  
 A[1]       1  
 A[2]       1  
 AA[0]      2  
 AA[15]     2   
 AA[27]     2

このデータを、最初に ID で、次に名前で並べ替えたいと思います。ID によるソートは int であるため簡単です。問題は名前にあります。数値でソートしようとすると、a[7]、a[27]、a[3] などの奇妙な値が返されます。アルファベット順でソートすると、a[10]、a[11]...a[19]、a[2] など、期待どおりの結果が得られます。
これは、フィールドが varchar であり、数値部分とテキスト部分の両方があるためだと思います。 . これを並べ替える方法はありますか?各部分 (テキストと数値) の長さが一定ではないため、部分文字列に分割することは悪いオプションのように思えます。
ありがとう!

4

2 に答える 2

1

あなたの要件のために、列を2つの部分に分割することを検討してください(つまり、 A[20] は A と 20 になります)、生成された分割値の組み合わせで並べ替えます。

したがって、クエリは、ID、名前の最初の部分(部分文字列の分割または取得によって取得)、to_number(名前の2番目の部分)による順序のようになります

于 2013-02-18T14:17:16.693 に答える
-2

さて、このような関数を作成するか、名前フィールドで部分文字列を使用することをお勧めします

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

参照を参照してください - http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/

ただし、列を分割する必要がある場合は、基になるデータベース設計に欠陥があるため、将来的にクエリのパフォーマンスの問題が発生することに注意してください。split 関数を使用してそのテーブルを再作成し、それを 2 つの列に分割します。ここに進む前に、3 つのレベルの正規化されたデータベースを読んでおく必要があります。

また、値を 1 つのフィールドから 2 つに分割します

于 2013-02-18T14:14:16.967 に答える