2011-09-16 18 views
2

結果セットの注文方法に関するルールがあります。私はCASEを使って列を注文して注文する必要があります。注文書にCASEを使用する

ORDER BY 
       CASE 
        WHEN ISNULL(actual_appearance_date, scheduled_appearance_date) IS NOT NULL AND icbm.emma_id IS NOT NULL -- We have it all! 
          THEN ISNULL(actual_appearance_date, scheduled_appearance_date) DESC , icbm.emma_id , version_number , icaci_t.[ijis_court_appearance_court_item_tracker_id] 
        WHEN ISNULL(actual_appearance_date, scheduled_appearance_date) IS NOT NULL AND icbm.emma_id IS NULL -- We have an appearance date, but it's manual. 
          THEN ISNULL(actual_appearance_date, scheduled_appearance_date) DESC, icaci_t.[ijis_court_appearance_court_item_tracker_id] DESC 
        WHEN ISNULL(actual_appearance_date, scheduled_appearance_date) IS NULL AND icbm.emma_id IS NOT NULL -- No appearance date, but it has a Business Message 
          THEN icbm.emma_id DESC, version_number DESC, icaci_t.[ijis_court_appearance_court_item_tracker_id] DESC 
        ELSE icaci_t.[ijis_court_appearance_court_item_tracker_id] DESC -- No Appearance date, not Message. 
       END 

をしかし、私だけTHEN後の列を含めることができそうです。

は、私はこれをしようとしています。しかし私は、私のルールに基づいていくつかの列を使用する必要があります。

これを行う方法はありますか?

+2

ご注文のないサブクエリの選択されたカスケードでこの醜いコードを使用して、親クエリの1つの列で注文することができます –

+0

@Andrey:しかし、各THENは複数のものを注文して返します。私はあなたが同じ条件(あなたが並べ替えたい各コンポーネントに1つ)で4つのケースが必要だと思う。 SQL Serverが配列をサポートしていて、それらを分別してソートすれば、CASEの各ブランチから配列を返すことができます(PostgreSQLはこの種のチキャンタリーをサポートすると思いますが、SQL Serverについてはわかりません)。 –

+0

@muが短すぎます:T-SQLでは配列がありません。 –

答えて

4

異なる行で異なるルールで結果セットを並べ替えることは、実際には意味がありません。競合するルールは、行間の個々の順序がどのようになるか不一致になります。言い換えれば、注文ルールに一貫性がない場合、一貫した注文はありません。

しかし、私は、あなたがこの問題を必要以上に複雑にしていると思われます。

ISNULL(actual_appearance_date, scheduled_appearance_date) DESC , icbm.emma_id , version_number , icaci_t.[ijis_court_appearance_court_item_tracker_id] 

NULL値は並べ替えられ、一緒に並べ替えられます。おそらくここから出発して、何が変わる必要があるかを理解してください。

+0

+1最後の項目にはおそらく 'DESC'指定子が含まれているはずです(最初のTHENでOPがそれを見逃していたはずです) –

+0

これはうまく見えます - actual_appearance_dateとsheduled_appearance_dateはどちらもnullでもかまいません。これでも動作しますか? – Craig

+0

実際には、それらの行がNULL値でソートされるという意味ではまだ機能します。あなたの正確な要件を満たすために上記を調整する。 –

0

T-SQLでは、CASEは、(一部の言語のように)フローステートメントの制御ではなく、単一の値を返す式です。したがって、複数の列が必要な場合に式を繰り返す必要があります。各式は互換性のあるデータ型を返す必要があります。ここではいくつかのショートカットが可能ですが、ロジックの一部を見逃している可能性がありますが、これらの列の一部にエイリアスを作成してサブクエリを使用すると、CASEの構造化が容易になります。

SELECT * FROM 
(
    SELECT 
     /* other columns */ 
     as_date = COALESCE(actual_appearance_date, scheduled_appearance_date), 
     emma_id = icbm.emma_id, 
     vn = version_number, 
     ca = icaci_t.[ijis_court_appearance_court_item_tracker_id] 
    /* rest of query */ 
) AS x 
ORDER BY 
CASE WHEN as_date IS NOT NULL THEN as_date END DESC, 
CASE WHEN as_date IS NOT NULL AND emma_id IS NOT NULL THEN emma_id END, 
CASE WHEN as_date IS NOT NULL AND emma_id IS NULL THEN ca END DESC, 
CASE WHEN as_date IS NULL AND emma_id IS NOT NULL THEN emma_id DESC, 
CASE WHEN as_date IS NOT NULL AND emma_id IS NOT NULL THEN vn END, 
CASE WHEN as_date IS NULL AND emma_id IS NOT NULL THEN vn END DESC, 
CASE WHEN as_date IS NULL AND emma_id IS NOT NULL THEN ca END DESC, 
ca DESC; 
0

あなたがそれを行う方法はありますが、それは醜い醜いハックです。

単純に列を連結し(varcharsでない場合は変換してください)、左から右に追加してください。上記のようなあなたの日付文字列をYYYY、MMにフォーマットされていることを確認する必要がありますTHEN

(CONVERT(VARCHAR(10)、actual_appearance_date、111))SELECT +(VARCHAR、emma_id)に変換

、DD( )注文が正しいようにします。列の降順で並べ替える場合は、文字列を反転することができます。

この解決策はうまくいくが、道徳的には厄介なので、危険にさらして使用してください。

関連する問題