- みみ
- 会議室デビュー日: 2008/07/10
- 投稿数: 12
|
投稿日時: 2008-11-05 15:11
SQLでセレクトしたデータを、番号順にソートします。
1→2→3・・・→15→A→B→
のように、まず数値、次に文字の順にしたいのですが、「9」の次は「A」になってしまいます。
(データ型は文字列なのですが、勝手に判断してしまうようです。)
よい指定の仕方があれば、教えてください。
|
- よっしー
- 大ベテラン
- 会議室デビュー日: 2007/05/17
- 投稿数: 143
|
投稿日時: 2008-11-05 15:59
みみさんこんにちは。
とりあえず、DBMSはなんでしょう?
あと、例えば1Aは20の前に来るのですか?それとも文字だから後に来るのですか?
引用: |
| みみさんの書き込み (2008-11-05 15:11) より:
(データ型は文字列なのですが、勝手に判断してしまうようです。)
|
文字列のソートだから当然ではないでしょうか?
|
- johnes
- ベテラン
- 会議室デビュー日: 2007/11/21
- 投稿数: 50
|
投稿日時: 2008-11-05 16:40
情報が少なすぎますが単純に考えた方法だけ言うと、
桁数決めてスペース埋めしてやれば良いんじゃないでしょうか?
要は '1', '2', '10' というデータがあった場合
'1', '10', '2' ではなく '1', '2', '10' で並んでほしいってことですよね?
まずはのようにして並べて取り出してから、Trimしてやればいいかと。
|
- かつのり
- ぬし
- 会議室デビュー日: 2004/03/18
- 投稿数: 2015
- お住まい・勤務地: 札幌
|
投稿日時: 2008-11-05 16:47
RDBMSの照合順に従って辞書順にソートされた結果です。
勝手に判断なんてしていません。
「番号順」と仰っても、傍から見ると単に文字列でしかありません。
みみさんの業務ルールでの「番号順」とは一体どんな定義なのでしょう?
16進数だったりしますか?
自分がもし[0-9A-Z]というパターンで、
みみさんが仰るようなソートをする場合、
関数で36進数→10進数という変換を行う関数を作って、
その結果でソートするかと思います。
もしデータベースの変更が可能なら、
テーブルに予め10進数変換した値を入れておきます。
|
- 無名tiger
- 常連さん
- 会議室デビュー日: 2008/04/18
- 投稿数: 36
|
投稿日時: 2008-11-05 16:50
ORACLE:
ORDER BY CASE WHEN TRIM(TRANSLATE(C1,'0123456789',' ')) IS NULL THEN LPAD(C1,38,'0') ELSE C1 END
SQL Server:
ORDER BY CASE WHEN ISNUMERIC(C1)=1 THEN REPLICATE('0',38-DATALENGTH(C1))+C1 ELSE C1 END
※列名=C1 長さ=38の例
参考になれば幸いです。
_________________ カスタマイズ自由自在のスタートページ。
|
- rain
- ぬし
- 会議室デビュー日: 2006/10/19
- 投稿数: 549
|
投稿日時: 2008-11-05 16:57
・英数混じりの文字列は存在しない
・数値は、非負の整数である
といったような前提がほしいところですね。
(追加)
・数値でないデータは、英字の大文字(A〜Z)のみの文字列とする
・数値でないデータの並びは、辞書順とする
[ メッセージ編集済み 編集者: rain 編集日時 2008-11-05 17:01 ]
|
- みみ
- 会議室デビュー日: 2008/07/10
- 投稿数: 12
|
投稿日時: 2008-11-05 17:12
つたない説明に、たくさんの回答ありがとうございました。
数値順にソート、次に、文字順にソート、したかったもです。
無名tiger様に教えていただいた、ISNUMERIC関数を使って、実現することができました!!
Aを16進の数値として扱っていると勘違いしていたため、
変な質問の仕方になってしまい、申し訳ありませんでした。
|