2011-01-06 11 views
0

私が行う必要があるのは、Classroom、Laboratories、講堂、オーディトリウムの順番です。私がしなければならないのは、IDでそれらを整理することです。教室では1から始まり、それに応じて上がります。ORDER BY CASE()内のASC/DESCの使用

私が利用するフィールドはroomIDとtypeカラムだけです。 (それはハァッSQL関数であるかのように見てタイプを変更すべきか?)

SELECT * 
    FROM `rooms` 
ORDER BY CASE WHEN `type` = 'Classroom' 
    THEN 1 
    WHEN `type` = 'Computer laboratory' 
    THEN 2 
    WHEN `type` = 'Lecture Hall' 
    THEN 3 
    WHEN `type` = 'Auditorium' 
    THEN 4 
    END 

それは十分に単純なようだが、私はそれを動作させることはできません。だから、これはおそらく愚かな質問かもしれないので、特に助けていただければ幸いです。

答えて

2

このようなケースのステートメントをクエリフィールドに置き、エイリアスを付ける必要があります。次に、そのエイリアスを使用するようにステートメントで注文を設定します。

SELECT *, 
CASE 
WHEN type = 'Classroom' THEN 1 
WHEN type = 'Computer laboratory' THEN 2 
WHEN type = 'Lecture Hall' THEN 3 
WHEN type = 'Auditorium' THEN 4 
END AS ClassTypeValue 
FROM rooms 
ORDER BY ClassTypeValue 

これが正しく動作するはずです。

+0

+1 @spinonおそらく正しいですが、これは異なるdBで同じように動作しないと思われます。例えばあなたが必要とされている場所やSyed Abdul Rahman'sがある場所は –

+0

です!最後の行はORDER BY roomIDですが、ありがとうございます。 ASCかDESCで何かを注文する必要があるなら、私は最初に他のCASEを「グループ化」する必要があります。 –

+0

@conradあなたはおそらく正しいでしょう。彼が何のデータベースを使っていたのかというタグはありませんでしたので、私はそれを可能性としてそこに投げ捨てました。 – spinon

1

スピンオンの答えはあなたのために動作しない場合は、常にそれには、インラインビュー

SELECT * 
FROM 
(

    SELECT *, 
     CASE 
     WHEN type = 'Classroom' THEN 1 
     WHEN type = 'Computer laboratory' THEN 2 
     WHEN type = 'Lecture Hall' THEN 3 
     WHEN type = 'Auditorium' THEN 4 
     END AS ClassTypeValue 
    FROM rooms 
) t 
ORDER BY ClassTypeValue 
+0

このコードは、ある意味で、どのCASEが入っているかを示す新しい列を作成します。 –

+0

@Syed Abdul Rahman。どちらの方法もこれを行います。主な違いは、これは、 'ClassTypeValue'がORDER BYによって認識されることを保証することです。気にしない小さな利点の1つとして、ClassTypeValueがSELECTに表示される必要はありません。 –

0
SELECT * 
FROM 
    (
    SELECT *, 
     CASE 
     WHEN type = 'Classroom' THEN 1 
     WHEN type = 'Computer laboratory' THEN 2 
     WHEN type = 'Lecture Hall' THEN 3 
     WHEN type = 'Auditorium' THEN 4 
     END AS ClassTypeValue 
    FROM rooms 
    ) t 
ORDER BY ClassTypeValue, maxppl, roomID 

これは私が使用しているの最後のクエリでを作ることができるだけで。私を助けてくれてありがとう、ありがとう。