3

数値を並べ替えたいvarchar列があります。これは、このトリックを使用するときにうまく機能します:https ://stackoverflow.com/a/5418033/1005334 (要するに:) ...ORDER BY Result * 1

ただし、関連する表には結果が含まれています。したがって、次のようなことが起こります。

Result
------
DNS
DNF
1
2
3

番号は正しい順序になっていますが、DNFこのように並べ替えると、番号の上に表示されます。私が欲しいのは、数字でソートすることですが、数字以外の数字は数字のにアルファベット順にソートされます。そのようです:

Result
------
1
2
3
DNF
DNS

この結果を得るために、どのようにクエリ(できればORDER BY句のみ)を変更できますか?

4

5 に答える 5

4

LPADを使用する

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_lpad

LPAD(yourField, 20, '0');

これにより、「varchar数値フィールド」の正しい順序が管理され(10は2の後になります)、最後に文字列が配置されます。

SqlFiddle

2番目の引数(20)はかなり恣意的です。これは、フィールド内の最長の文字列の長さと同等(またはそれ以上)である必要があります。

于 2012-09-06T08:08:42.083 に答える
2
SELECT *, (Result REGEXP '^[0-9]+$') AS is_numeric
FROM table_name
ORDER BY is_numeric DESC, 
    CASE WHEN is_numeric THEN (Result + 0) ELSE Result END ASC
于 2012-09-06T08:12:37.770 に答える
1

これを試して:

ORDERBY句を次のように変更してください。

  ORDER BY
  CASE WHEN Result REGEXP '^[0-9]+$' THEN Result*1 else 999999 END,
       Result 

これにより、数値が最初に並べられ、次に残りが並べ替えられます

于 2012-09-06T08:09:11.490 に答える
1

これは、 MySQLのREGEXPを使用して行うことができます。これを試してみてください

SELECT *
FROM tablea
ORDER BY  IF(`Result` REGEXP '^-?[0-9]+$', 0, 1) ASC,
          `Result` ASC

SQLFiddleデモ

于 2012-09-06T08:08:43.970 に答える
0
ORDER BY CAST(`Result` AS SIGNED) DESC

これはうまくいくはずです。

于 2012-09-06T08:10:03.597 に答える