- PR -

数値&文字列 混在データのソート

1
投稿者投稿内容
みみ
会議室デビュー日: 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' で並んでほしいってことですよね?
まずは
コード:
'    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進の数値として扱っていると勘違いしていたため、
変な質問の仕方になってしまい、申し訳ありませんでした。
1

スキルアップ/キャリアアップ(JOB@IT)