1

注文表があります。注文ごとに、ユーザーは (一意ではない) 注文番号を入力できます。これは、彼らが望むものなら何でもできます。

これらの注文を HTML テーブルに表示し、注文番号などのさまざまなフィールドで注文を並べ替えることができます。

クライアントの 1 人が、並べ替えの問題に気付きました。注文番号は として保存されるためVARCHAR、辞書順でソートされます。問題は、すべての注文番号が数字であるとは限らないことです。一部は単語であり、他は英数字です。

たとえば、次のような注文番号を指定できます。

42
Order8
MyOrder
9
Order63

を使用してソートするORDER BY orderNumberと、次のようになります。

42
9
MyOrder
Order63
Order8

デモ: http://sqlfiddle.com/#!2/7973e/1

これは私が望むものではありません。私はそれらを次のようにソートしたい:

9
42
MyOrder
Order8
Order63

文字列は辞書式に、数字は数値にしたい。私はうまくいくかもしれない何かを考えました:

ORDER BY IFNULL(NULLIF(CAST(orderNumber AS SIGNED), 0), orderNumber)

デモ: http://sqlfiddle.com/#!2/7973e/2

しかし、残念ながら、同じ結果が得られます (数値が文字列に再キャストされるため)。これらの値を希望どおりに並べ替えるにはどうすればよいですか? 文字列をある種の数値に「変換」する方法があればよいのですが。

4

2 に答える 2

4

数値が表示されたら、注文番号をゼロで埋めてみてください。たとえば、これを参照してください。

http://sqlfiddle.com/#!2/7973e/21

SELECT  
  CASE 
    WHEN CAST(orderNumber AS SIGNED) != 0 THEN LPAD(orderNumber, 10, '0')
    ELSE orderNumber 
  END as padded, 
  orders.*
FROM orders
ORDER BY
  padded

結果:

|     PADDED | ORDERID | ORDERNUMBER |
--------------------------------------
| 0000000009 |       4 |           9 |
| 0000000042 |       1 |          42 |
|    MyOrder |       3 |     MyOrder |
|    Order63 |       5 |     Order63 |
|     Order8 |       2 |      Order8 |

完全な開示: 私は SQL Fiddle の作成者です。

于 2012-08-17T18:30:03.633 に答える
2

次の方法で、必要なものに近づけることができます。

ORDER BY CASE WHEN CONVERT(OrderNumber, SIGNED INTEGER)= 0 
         THEN 1e50
         ELSE CONVERT(OrderNumber, SIGNED INTEGER)
         END ASC, OrderNumber ASC

ただし、混合 (テキスト/数字) の注文番号を最後の桁 (Order63、Order8 など) でソートする必要がある場合は、さらに作業が必要になります。

于 2012-08-17T18:30:49.663 に答える