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

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/02/17 12:35:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:frkw2004 No.1

回答回数194ベストアンサー獲得回数21

ポイント20pt

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

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

Select fld from table

Group by

Case fld When 1 THEN 'Z1'

WHEN 2 THEN 'Z2'

ELSE FLD END

id:suzume_oyado

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

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

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

2010/02/10 14:07:57
id:yamauchi45 No.2

回答回数12ベストアンサー獲得回数0

ポイント20pt

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

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

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

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

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

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

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

id:suzume_oyado

なるほど・・・。

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

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

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

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

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

2010/02/10 23:10:41
id:ardarim No.3

回答回数897ベストアンサー獲得回数145

ポイント20pt

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

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

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

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

id:suzume_oyado

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

2010/02/11 02:27:50
id:chuken_kenkou No.4

回答回数722ベストアンサー獲得回数54

ポイント20pt

例えば、先頭から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
;
id:suzume_oyado

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

2010/02/11 10:11:01
id:chuken_kenkou No.5

回答回数722ベストアンサー獲得回数54

ポイント20pt

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

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')
;
id:suzume_oyado

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

2010/02/11 16:03:19
  • id:ardarim
    この辺(仕様)を見ながらsqlite3.exeで適当に試行錯誤しながら見つけましたw
    http://www.sqlite.org/datatype3.html
    http://www.sqlite.org/lang_expr.html

    なんかこういう裏技的なのを探す作業は楽しいですねww
  • id:suzume_oyado
    うぉぉぉ。すごいっす・・・。
  • id:chuken_kenkou
    C言語でのコンパイル環境は、作れますか?

    SQLite 3以降なら、collating sequenceを、追加したり変更することが
  • id:suzume_oyado
    >C言語でのコンパイル環境は、作れますか?

    はい。作れます!
    どうすれば良いでしょうか?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません