2012-03-26 6 views
8

デフォルトでは、SQLは文字の前に数字を並べます。ORDER BY SQLで[0-Z]の代わりに[a-9]を使用したvarchar

私は列 "名前" を持っているのであれば:0-Z(9〜第0、その後、AZ)によるSQLソートので

abc 
ab1 
a1b 
1ba 
1bac 
b21 

を、クエリ

SELECT * FROM ... ORDER BY name 

はになります:

1ba 
1bac 
a1b 
ab1 
abc 
abc1 
b21 

しかし、私はそれをa-0(最初はaZ、次に0-9)でソートします。

abc 
abc1 
ab1 
a1b 
b21 
1ba 
1bac 

クエリでこれを行うにはどうすればよいですか?具体的には、SQLiteでこれをどうやって行うのですか?

Sort MySQL results alphabetically, but with numbers lastで1つの解決策が見つかりましたが、最初のチャートのみが見つかりました。

+0

値は常に3文字ですか? – gbn

+0

['regexp'](http://sqlite.org/lang_expr.html)を使用する[Cインタフェースを使用して関数を作成する](http://www.sqlite.org/c3ref/create_function.html) )演算子を使用して文字と数字を別々の列にヤンクします。 –

+0

@gbnいいえ、長さは非常に長くなります。おそらくそれを示しているはずです: – Nic

答えて

0

これが私の考えです:あなたは、最初の文字が数値であるかどうかを確認する別の「help_column」を追加し、それに1を割り当て、それ以外の名前で、この列で0、その後順位を割り当て、:

select *, case 
      when substring(name,1,1) like '[0-9]' then 1 
      else 0 
      end as help_order 
from (
select 'ab1' as name union select 'a1b' as name union select '1ba' as name union select 'b21' as name 
) a 
order by help_order, name 

もちろん、必要に応じて複数の番号を扱うには、正規表現[0-9]を改善する必要があります。

もちろん、内側のクエリ(テーブルといくつかのユニオンを持つもの)を置き換える必要があります。

+0

これは最初の文字でのみ機能します(私は最初の試行で同じミスを犯しました) –

1

これらのデータとテストしてください

declare @t table(a char(3)) 
insert @t values('ab1') 
insert @t values('a1b') 
insert @t values('1ba') 
insert @t values('b21') 
insert @t values('12a') 
insert @t values('13b') 


select a, 
patindex('[0-9]%', a + 'a'), 
patindex('_[0-9]%', a + 'a'), 
patindex('__[0-9]%', a + 'a') 
from @t order by 2, 3, 4, 1 

または

select a 
from 
(select a, 
patindex('[0-9]%', a + 'a') b, 
patindex('_[0-9]%', a + 'a') c, 
patindex('__[0-9]%', a + 'a') d 
from @t) e 
order by b, c, d, a 
+4

これは有効なSQLiteだとは思わない構文。 –

3

桁は(例えば~など)の高ASCII文字に置き換えて、私は、name_replaceを言って、別の列をINGのSELECTを示唆していますその列をソートしてから名前をソートします。残念ながら、SQLiteはregular expressionのサポートが置き換えられていない:name_replaceにソートする場合

SELECT name, replace(... replace(replace(name, '0', '~'), '1', '~') ... '9', '~') AS name_replace 
    FROM mytable 
ORDER BY name_replace, name 

桁が最後に来ます。 nameでソートすると、数字で注文します。

0

Thsiは、ASCII 122(小文字のz)の上に0-9を置き換えます。

SQLLiteは

:-)もちろんの

未テストを試みる(123)私のCHARの代わりに必要とされることができる(CHAR(132)に例えばCHAR(123))文字コードによる置換を行うにはCHAR関数を持っていません

ORDER BY 
    REPLACE 
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(name, '0', '{0') 
    , '1', '{2') 
    , '2', '{2') 
    , '3', '{3') 
    , '4', '{4') 
    , '5', '{5') 
    , '6', '{6') 
    , '7', '{7') 
    , '8', '{8') 
    , '9', '{9') 

編集:@デビッドフェーバーのソリューションは同じですが、やや単純を行い、けれども...

2

これは、提供されたデータとのトリックを行います。

SELECT * 
FROM Table 
ORDER BY Name COLLATE SQL_EBCDIC037_CP1_CS_AS 

さまざまな照合タイプを調べて、ボード全体で必要なことを確実に行うことができます。

更新:SQLiteについて言及しましたが、私はこれをMSSQLでテストしました。この照合がSQLiteで利用できるかどうかは不明ですが、以下のコメントには有用な情報があるかもしれません。

+1

OPが実際にSQLiteを言及しましたが、これはうまくいく可能性があります。しかし、トリックを行うSQLiteに既存の照合順序があるかどうかはわかりませんが、作成する必要があります。 @DavidFaberが指摘しているように –

+0

では、実際のターゲットプラットフォームはSQLiteです。 私はhttp://sqlite.org/datatype3.htmlを見つけました しかし、このソリューションがSQLiteで実行可能かどうかは分かりません。 – Nic

+0

私はそれに応じて、私の答えを更新しました –

関連する問題