2009-04-17 4 views
25

BY条件ORDER私はそれが条件をsatisfiess場合、それはたとえば、MS SQL:ASC/DESC質問

を降順で注文する必要がありますので、私のクエリで順序を条件付きにできるようにすることにしたい:

SELECT * FROM Data ORDER BY SortOrder CASE WHEN @Direction = 1 THEN DESC END 

答えて

36

のようなものを行っている:

SELECT * FROM table 
ORDER BY 
CASE WHEN @Direction = 1 THEN -id else id END asc; 

OP尋ねる:Guysは、私はSQLの専門家ではないよ

、それは順序の方向を制御ず、idと-idを意味するものを私に説明してください?

idは、並べ替える列だけです。 -idはそれを否定するだけです、id * -1。あなたが複数の列でソートしている場合は、各列を否定する必要があります:

SELECT * FROM table 
ORDER BY 
CASE WHEN @Direction = 1 THEN -id else id END 
CASE WHEN @Direction = 1 THEN -othercolumn else othercolumn END ; 

あなたが非数値カラムで注文している場合は、その列を作る表現を見つける必要があります"負";それを行う関数を書くことが役に立ちます。あなたはまた、すべての列タイプをサポートしていますスキーム使用することができます

+0

Guys、私はSQLエキスパートではありません。idと-idを意味するものを説明してください。注文の方向を制御していますか? – Shimmy

+0

また、私は私のクエリを編集しました、それを確認してください。 – Shimmy

+0

だから私は実際にASCを書く必要はありません、そうですか? – Shimmy

1

私はソート・バイされているものの符号を、ASCまたはDESCを変更する変更しないでください。この

select productId, InventoryCount, 
    case 
    when @Direction = 1 then InventoryCount 
    else -InventoryCount 
    end as "SortOrder" 
order by 3 
+0

を、私は、クエリを確認してください 質問に私のクエリを編集しました。 – Shimmy

+0

私の答えは基本的には受け入れられた答えと同じですが、彼の方がいいですが、ロジックがORDER BY句に完全に含まれています。 – MikeW

9
SELECT * 
FROM Data 
ORDER BY 
Case WHEN @Direction = 1 THEN SortOrder END DESC, 
Case WHEN 1=1 THEN SortOrder END 
7

:私はとにかく、あなたが書いたものを理解していない

SELECT <column_list> FROM <table> ORDER BY CASE WHEN @sort_order = 'ASC' AND @sort_column = '<column>' THEN <column> END ASC, CASE WHEN @sort_order = 'DESC' AND @sort_column = '<column>' THEN <column> END DESC

+0

これは動作するようですが、私は 'asc'/'desc'が 'end'の後にどのように呼び出されるのか理解していませんか? – mulllhausen

+1

@mulllhausen case文がfalseの場合、すべての行に対してNULLが返されるため、ソートの効果がなくなり、デフォルトで呼び出されます。 – Tsaukpaetra