- ベストアンサー
SQL ORDER BY の結果について
SQLのORDER BYの結果表示がおかしく困っています。 テーブル名:社員名簿 プライマリーキー無し (設定厳禁) フィールド: | 社員ID | 氏名 | 住所 | | VARCHER|VARCHER|VARCHER| | P1 | 田中 |東京都 | | P2 | 鈴木 |東京都 | | P10 | 高橋 |千葉県 | SQL文: SELECT * FORM 社員名簿 ORDER BY 社員ID 出力結果: | 社員ID | 氏名 | 住所 | | P1 | 田中 |東京都| | P10 | 高橋 |千葉県| | P2 | 鈴木 |東京都| 上記のような出力結果となってしまいます。 何か良い方法はありませんか? よろしくお願いします
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.1の方と同じです。 補足しますと、並び替えのルールとして、まず1桁目をソートし、次に2桁目をソートする、と言うふうに考えるとわかりやすいと思います。 P1,P2,P10とあると、まず、1桁目のPでソートとし、(この場合全て同じですね)、次に2桁目で1(P1),1(P10),2(P2)とソートします。 ですから、最大桁を見込み、0を埋めるようにしないといけません。 P0001と言った感じです。
その他の回答 (3)
- --neiro--
- ベストアンサー率15% (22/139)
#1さん達の仰られるとおり、データベースの構造を変えられた方が良いと思いますが、データベースを作り直す事が出来ない場合の(既存データが既に存在したり)矯正手段として以下参考にお読み下さい。 Order By で、[社員ID] ではなく、[LPAD(社員ID,5,' ')]としてみては? スペースが社員IDのコード長5になるように挿入されますので。 ただし、データベースがオラクルであった場合なのですが(^^;
- ssm3u
- ベストアンサー率52% (19/36)
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設計として良いと思いますが・・・
- taknt
- ベストアンサー率19% (1556/7783)
これは、そうなると思います。 つまり、数値としてのソートではなく、文字列としてソートになるからです。 あ あい い いい と いう順で並ぶのが 正しいでしょう。 これと同じことです。 数値として並ばせるならば P01 P02 P10 と 0をつけて 補ってあげないとダメです。 か もしくは Number型にするかのどちらかですね。