2009-04-02 4 views
4

SQLSERVER/MSSQLでSQL Server内の特定の文字で始まるアルファベット順に並べなさい、ここで問題です。結果のレコードが

例:

'Ioren' 'Iumen' 'タルト' 'Arfen' 'Coldry'

私は労働組合または複数のSQL文を使用したくない...だけ特別句で注文して捕まえようとする。

私が試してみた:

ORDER BY <field> REGEXP '^I' DESC 

が、それはうまくいきませんでした。

アイデア?

答えて

3

これはそれを行う必要があります。

ORDER BY CASE WHEN SUBSTRING([Translation Color],1,1) = 'l' 
    THEN 1 ELSE 0 END DESC 

EDIT:それから、私から始まる完全注文時間に戻ってラウンドをループため

完全答えは次のとおりです。

ORDER BY CASE WHEN ASCII(UPPER(SUBSTRING([Translation Color],1,1))) < 73 
     THEN ASCII(UPPER(SUBSTRING([Translation Color],1,1))) + 26 
     ELSE ASCII(UPPER(SUBSTRING([Translation Color],1,1))) END ASC,  
     [Translation Color] ASC 

このことに注意してください大きなテーブルのパフォーマンスに影響します。また

+0

==エラーが発生しますが、1つは機能します!ありがとうございました – apelliciari

+0

特に、大規模なデータセットを持っている、または持っている可能性がある場合は、パフォーマンスは許容されていることを確認してください。 –

+0

ええ、申し訳ありませんが、moでC#でコーディングしていますが、正しく編集しました。 – cjk

2

これは何かいいです:

select [Translation Color], 
    case when [Translation Color] < 'l' then 1 
        else 0 
        end as Priority 
from t1 
order by Priority, [Translation Color] 

これはalphabeticly 'L' で始まるそれを注文します

編集 このソリューションは、私のために働くようだ:

create table t1 (c1 varchar(20) collate SQL_Latin1_General_Cp437_CI_AS) 

次に、いくつかのテストデータを入力して実行します。

select c1 
from t1 
order by case when c1 >= 'l' then 0 else 1 end, c1 
+0

+1:素敵な答え、非常にきれいですが、selectステートメントで別の要素を使用します – cjk

+0

私の編集は完全に動作しますが、order by節は使用しません。 –

+0

... * now * order by節を使用していません! –

1
SELECT * 
FROM [Translation Color] 
ORDER BY 
    CASE WHEN [Language Code] LIKE '[I-Zi-z]%' THEN 0 ELSE 1 END, 
    [Language Code] 
+0

+1:いい答えですが、大きなデータセットではLIKE句がかなり遅くなる可能性がありますが、私の場合ほど遅くない可能性があります:)(ただし、これは小さなルックアップテーブルと仮定します) – cjk

+0

@ck、LIKEは理想的ではありませんが、 [言語コード]列の任意のインデックスを使用できるはずです。 SUBSTRING、ASCII、UPPERなどを使用するとテーブルスキャンが必要になると思われます。 – LukeH

+0

@ck、私はそれがおそらく小さなルックアップテーブルであることに同意します。しかし、たとえパフォーマンスの低下が不可欠ではないとしても、私の答えはすべての文字列関数よりも読みやすいと思います。 – LukeH