1

SQL Server ストアド プロシージャからレポートを生成する必要があります。条件は同じですが、10 列の結果が異なります。

これには CASE ステートメントを使用しています。また、各 CASE 内に IF/ELSE ブロックがあります。この IF/ELSE ブロックは、さまざまな列からデータを取得します。

次のように、同じ CASE ステートメントを 10 回繰り返しています。

SELECT     
CASE WHEN table1.Field="aa"
THEN 
  select table2.Field
ELSE 
   select table3.Field
END  as 'FirstColumn',  

 CASE WHEN table1.Field="aa"

THEN 
   select table4.Field 
ELSE 
 table5.Field END as 'SecondColumn'  

このようにして、同じ CASE ステートメントを 10 回繰り返さなければなりませんでした。誰かがより良いアプローチを提案できますか?

4

2 に答える 2

1

あなたの例によると、条件はすべての句で同じです:

table1.Field="aa"

この仮定が正しければ、この問題を解決するための別のアプローチを提案します。可能性ごとに 1 つずつ、2 つのクエリを作成し、IF ELSE 構文を使用してそれらを切り替えます。

このようなもの:

DECLARE @Var varchar(2)
SELECT @Var = Field
FROM table1 IF @Var = 'aa' BEGIN
SELECT table2.Field AS 'FirstColumn',
       table4.Field AS 'SecondColumn'
FROM table2,
     table4 END 
ELSE BEGIN
SELECT table3.Field AS 'FirstColumn' ,
       table5.Field AS 'SecondColumn'
FROM table3,
     table5 END

SQLFiddleで実際の例を見つけることができます。

私が何かを誤解している場合はお知らせください。修正を試みます;-)

于 2013-07-28T13:48:08.193 に答える
0

これはコメントとしてより適切かもしれませんが、長すぎます。

あなたのSQLは意味がありません。括弧のない句にサブクエリがあるwhenため、これは有効な SQL ではありません。さらに、文字列を二重引用符で囲んでいます。これは"aa"、定数ではなく列参照として解釈されることを意味します。最後に、列の別名を一重引用符で囲みます。これは許可されていますが、悪い習慣です。

また、SQLでは許可されていないため、「各CASE内にIF / ELSEブロックがある」という意味もわかりません。

つまり:

select (CASE WHEN table1.Field = 'aa' THEN table2.Field
             ELSE table3.Field
        END)  as FirstColumn,
       (CASE WHEN table1.Field = 'aa' then table4.Field 
             ELSE table5.Field
        END) as SecondColumn

Thencaseステートメントは、ロジックを正しくキャプチャしているようです。table1.field(クエリ全体で一定ではなく)行ごとに異なる可能性があるため、これを「単純化」する方法がわかりません。

しかし、私はたくさんの仮定を立てました。実際のコードのより良い例で質問を変更する必要があります。または、この質問を削除して、より適切な説明で最初からやり直してください。

于 2013-07-28T12:51:10.780 に答える