人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQLを教えて下さい。B A C 2 1 を OrderByすると 1 2 A B C になりますが。
これを A B C 1 2 にOrder Byさせる事は可能でしょうか?
テキスト型のフィルードです。
使っているのは SQLiteです。

こちらのPup SQLtieを使っています。
https://www.eonet.ne.jp/~pup/software.html



●質問者: suzume_oyado
●カテゴリ:コンピュータ インターネット
✍キーワード:SQL SQLite テキスト フィル
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● ふるるP
●20ポイント

数値の場合に、文字に置き換えると良いかと。

もしソートのスウィッチが有るなら調べてみると良いでしょう。私はSQLiteを持っていないので標準のSQLでの記述になりますが。

Select fld from table

Group by

Case fld When 1 THEN 'Z1'

WHEN 2 THEN 'Z2'

ELSE FLD END

◎質問者からの返答

すみません。1、2は 1ban 2banや 1a1aもあるので、case文に全部かけないです。

任意の数字・文字列混在の値が対象です。

なんとかならないでしょうか?


2 ● yamauchi45
●20ポイント

SQLiteのことや、DBを扱う実装を何で行っているのかよく分からないのででなんとも言えないのですが、

前の回答からすると、order by 一発ではちょっとうまく行かない気がします。

ソート用のフィールドを別途準備して、データをINSERTするときに、

・アルファベットは全部大文字に直す

・数値は、例えば、1→a,2→bといったように小文字に直す

という処理をして、別フィールドに格納し、order by に使用する

というのはどうでしょう。

◎質問者からの返答

なるほど・・・。

実装はCで行っています。SQL文で解決できるのであればと考えていました。

まさにOrderBy一発でできないかなと。

エントリ数が膨大な為、あまり別フィールドを用意したくないのが、本音です。

もう少し、他の方の回答を持ってみます。

ただし、「純粋にSQL文で」が希望です。


3 ● ardarim
●20ポイント

Pup SQLtieで通用するかどうかは分かりませんが、標準のSQLite3であれば、以下のようなSQLでいけます。

SELECT x ORDER BY (x<'A'),x;

(x<'A') は、辞書順で 'A' より小さい(数字など)場合に 1 に、

'A' を含めより大きい(英字など)場合に 0 になります。

◎質問者からの返答

すごい・・・。確かに・・・。これは、ご自分で考えられたのでしょうか?


4 ● chuken_kenkou
●20ポイント

例えば、先頭から3列について、順序を英字<数字としたい場合

SELECT
 *
 ,SUBSTR(val,1,1) AS "1st"
 ,SUBSTR(val,2,1) AS "2nd"
 ,SUBSTR(val,3,1) AS "3rd"
 FROM t1
 ORDER BY 
 CASE -- 1st byte
 WHEN SUBSTR(val,1,1) BETWEEN 'A' AND 'Z' THEN 1
 WHEN SUBSTR(val,1,1) BETWEEN '0' AND '9' THEN 2
 ELSE 0
 END
 ,SUBSTR(val,1,1)
 ,CASE -- 2nd byte
 WHEN SUBSTR(val,1,1) BETWEEN 'A' AND 'Z' THEN 1
 WHEN SUBSTR(val,1,1) BETWEEN '0' AND '9' THEN 2
 ELSE 0
 END
 ,SUBSTR(val,2,1)
 ,CASE -- 3rd byte
 WHEN SUBSTR(val,1,1) BETWEEN 'A' AND 'Z' THEN 1
 WHEN SUBSTR(val,1,1) BETWEEN '0' AND '9' THEN 2
 ELSE 0
 END
 ,SUBSTR(val,3,1)
 ,val
;
◎質問者からの返答

うーむ。3文字とも限らないので・・・。


5 ● chuken_kenkou
●20ポイント

ちょっと冗長ですが、列のデータ長には依存しない方法です。

select
 *
 from t1
 order by
 replace(
 replace(
 replace(
 replace(
 replace(
 replace(
 replace(
 replace(
 replace(
 replace(val,'0',x'f0')
 ,'1',x'f1')
 ,'2',x'f2')
 ,'3',x'f3')
 ,'4',x'f4')
 ,'5',x'f5')
 ,'6',x'f6')
 ,'7',x'f7')
 ,'8',x'f8')
 ,'9',x'f9')
;
◎質問者からの返答

うわぁ・・・・。た、確かに・・・。動作確認しました・・・。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ