web-dev-qa-db-ja.com

MS SQL:ASC / DESCによる条件付き注文質問

クエリの順序を条件付きにしたいので、条件を満たしている場合は降順で並べ替える必要があります

例えば:

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

ASCまたはDESCを変更しないでください。並べ替えられるものの符号を変更してください:

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

OPは尋ねます:

皆さん、私は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 ;

数値以外の列で並べ替える場合は、その列を「負」にする式を見つける必要があります。それを行う関数を書くと役立つかもしれません。

38
tpdi
SELECT * 
FROM Data 
ORDER BY 
Case WHEN @Direction = 1 THEN SortOrder END DESC, 
Case WHEN 1=1 THEN SortOrder END
10
Jeremy Giaco

すべての列タイプをサポートするスキームを使用することもできます。

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

8
LarsW

私はこのようなことをしました

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