これを A B C 1 2 にOrder Byさせる事は可能でしょうか?
テキスト型のフィルードです。
使っているのは SQLiteです。
こちらのPup SQLtieを使っています。
https://www.eonet.ne.jp/~pup/software.html
数値の場合に、文字に置き換えると良いかと。
もしソートのスウィッチが有るなら調べてみると良いでしょう。私はSQLiteを持っていないので標準のSQLでの記述になりますが。
Select fld from table
Group by
Case fld When 1 THEN 'Z1'
WHEN 2 THEN 'Z2'
ELSE FLD END
SQLiteのことや、DBを扱う実装を何で行っているのかよく分からないのででなんとも言えないのですが、
前の回答からすると、order by 一発ではちょっとうまく行かない気がします。
ソート用のフィールドを別途準備して、データをINSERTするときに、
・アルファベットは全部大文字に直す
・数値は、例えば、1→a,2→bといったように小文字に直す
という処理をして、別フィールドに格納し、order by に使用する
というのはどうでしょう。
なるほど・・・。
実装はCで行っています。SQL文で解決できるのであればと考えていました。
まさにOrderBy一発でできないかなと。
エントリ数が膨大な為、あまり別フィールドを用意したくないのが、本音です。
もう少し、他の方の回答を持ってみます。
ただし、「純粋にSQL文で」が希望です。
Pup SQLtieで通用するかどうかは分かりませんが、標準のSQLite3であれば、以下のようなSQLでいけます。
SELECT x ORDER BY (x<'A'),x;
(x<'A') は、辞書順で 'A' より小さい(数字など)場合に 1 に、
'A' を含めより大きい(英字など)場合に 0 になります。
すごい・・・。確かに・・・。これは、ご自分で考えられたのでしょうか?
例えば、先頭から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文字とも限らないので・・・。
ちょっと冗長ですが、列のデータ長には依存しない方法です。
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') ;
うわぁ・・・・。た、確かに・・・。動作確認しました・・・。
すみません。1、2は 1ban 2banや 1a1aもあるので、case文に全部かけないです。
任意の数字・文字列混在の値が対象です。
なんとかならないでしょうか?