2016-11-24 11 views
1

プロシージャに渡されるパラメータの1つに応じて、整数列またはvarchar列のいずれかでソートする必要があるストアドプロシージャ内のクエリがあります。ORDER BY <intまたはvarchar>

私は私のORDER BY句としてこれを持っている:私は、クエリを実行しようと

ItemName  ItemCode SubItemName SubItemCode 
Apple  AA1   Fuji   FJ1 
Apple  AA1   Gala   GL1 
Chicquita 1 
DelMonte  2 
Plantain  -1 
Orange  OR1  Satsuma  SS3 
Orange  OR1  Valencia  VL2 

:明確にするために

... 
ORDER BY 
CASE @ReportType 
    WHEN 1 THEN 
     ItemName + SubItemName 
    WHEN 2 THEN 
     ItemName + SubItemName 
    WHEN 3 THEN 
     SubItemName 
    WHEN 4 THEN 
     CONVERT(int,ItemCode) 
    ELSE 
     ItemName 
END 

、私のテーブル構造は、この(無関係の列は省略)のようなものです1,2,4のように@ReportTypeはすべて動作しますが、3を渡すとエラーが発生します:

Conversion failed when converting the varchar value 'Orange' to data type int. 

これは、ORDER BY節のすべてのケースが同じデータ型を持つ必要があるためです。私はvarchar型にすべてを変換することができ知っているが、私はCONVERT(varchar,ItemCode)でソートすれば、私はファンキーな順序を取得:

Chicquita 1 
Plantain  -1 
DelMonte  2 

それはいくつかのケースではvarchar型のフィールドでソートすることが可能であるが、他の例では整数を?

+0

どのdbmsを使用していますか? – jarlh

+0

SQL Server 2008R2を使用するSMSS。 – Echilon

答えて

1

問題はCASEが単一の型を返すことです。だから、ちょうどorder byに複数のキーを使用します。

ORDER BY (CASE WHEN @ReportType IN (1, 2) THEN ItemName + SubItemName END), 
     (CASE WHEN @ReportType = 3 THEN SubItemName END), 
     (CASE WHEN @ReportType = 4 THEN CONVERT(int, ItemCode) END), 
     ItemName 

CASE表現にはELSE句を持っていないので、彼らは一致しない値のためNULLを返します。

+1

素晴らしいですが、完璧に動作します。 – Echilon

関連する問題