3

こんにちは私は並べ替えによってmysqlで注文しようとしています

  • 特殊文字
  • 手紙
  • 次に数字

mysqlが並べ替えているようです

  • 特殊文字
  • 数字
  • その後、手紙

下記参照

select distinct uag_linecode from part order by uag_linecode;

| A-1          |
| A/C          |
| A1S          |  out of place
| ABP          |
| ABS          |
| ACI          |
| ADM          |
| ADR          |
| BAS          |

これは私が欲しいものです:

A-1 
A/C
ABR
ABS
ACI
ADM
ADR 
A1S correct spot
BAS

誰かが私を助けることができれば私は永遠に感謝するでしょう。

すべてのラインコードは常に3文字の長さです。

4

1 に答える 1

5

このようなものは、常に2番目の文字である場合に機能します。つまり、case句に追加して、1番目と3番目の文字をチェックできる場合があります...

select distinct uag_linecode,
substring(uag_linecode, 2, 1)
from part
order by 
  case 
    when substring(uag_linecode, 2, 1) REGEXP ('^[0-9]') THEN 1 ELSE 0 END , uag_linecode

これがSQLフィドルです。

--編集これは、1番目と3番目の文字でも機能するようです。

select distinct uag_linecode,
   substring(uag_linecode, 1, 1),
   substring(uag_linecode, 2, 1),
   substring(uag_linecode, 3, 1)
from part
order by 
   case when substring(uag_linecode, 1, 1) REGEXP ('^[0-9]') THEN 1 ELSE 0 END,
   substring(uag_linecode, 1, 1),
   case when substring(uag_linecode, 2, 1) REGEXP ('^[0-9]') THEN 1 ELSE 0 END,
   substring(uag_linecode, 2, 1),
   case when substring(uag_linecode, 3, 1) REGEXP ('^[0-9]') THEN 1 ELSE 0 END ,    
   substring(uag_linecode, 3, 1)

そしてもっとフィドル

また、@ Orblingが正しく言っているように、REDEXPを削除して> = '0' AND <= '9'を使用すると、パフォーマンスが向上します(特にレコードが多い場合)。

幸運を。

于 2013-01-29T17:06:01.297 に答える