アプリ版:「スタンプのみでお礼する」機能のリリースについて

SQLのORDER BYの結果表示がおかしく困っています。

テーブル名:社員名簿
プライマリーキー無し
(設定厳禁)
フィールド:
| 社員ID | 氏名 | 住所 |
| VARCHER|VARCHER|VARCHER|
| P1 | 田中 |東京都 |
| P2 | 鈴木 |東京都 |
| P10 | 高橋 |千葉県 |

SQL文:

SELECT * FORM 社員名簿 ORDER BY 社員ID

出力結果:
| 社員ID | 氏名 | 住所 |
| P1 | 田中 |東京都|
| P10 | 高橋 |千葉県|
| P2 | 鈴木 |東京都|

上記のような出力結果となってしまいます。
何か良い方法はありませんか?
よろしくお願いします

A 回答 (4件)

#1さん達の仰られるとおり、データベースの構造を変えられた方が良いと思いますが、データベースを作り直す事が出来ない場合の(既存データが既に存在したり)矯正手段として以下参考にお読み下さい。



Order By で、[社員ID] ではなく、[LPAD(社員ID,5,' ')]としてみては?
スペースが社員IDのコード長5になるように挿入されますので。

ただし、データベースがオラクルであった場合なのですが(^^;
    • good
    • 0

charactor に対するorder byである限り


P10の方がP2より前にくるのは当然です。
(同様の現象でしたら エクスプローラでも確認できます)
(P1,P2,P10というファイルを作ってソート)

P01, P02, P10 とするか

社員区分|社員ID
char(varchar)|smallint等
P|1
P|2
P|10
として order by 社員区分, 社員IDとする。

後者の方がDB設計として良いと思いますが・・・
    • good
    • 0

No.1の方と同じです。


補足しますと、並び替えのルールとして、まず1桁目をソートし、次に2桁目をソートする、と言うふうに考えるとわかりやすいと思います。
P1,P2,P10とあると、まず、1桁目のPでソートとし、(この場合全て同じですね)、次に2桁目で1(P1),1(P10),2(P2)とソートします。

ですから、最大桁を見込み、0を埋めるようにしないといけません。
P0001と言った感じです。
    • good
    • 0

これは、そうなると思います。


つまり、数値としてのソートではなく、文字列としてソートになるからです。


あい

いい
と いう順で並ぶのが 正しいでしょう。
これと同じことです。

数値として並ばせるならば
P01
P02
P10
と 0をつけて 補ってあげないとダメです。
か もしくは Number型にするかのどちらかですね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!