30

このサイトを広範囲に検索しましたが、解決策が見つかりません。

これが私のクエリの例です:

SELECT 
   ActivityID,

   Hours = (CASE 
                WHEN ActivityTypeID <> 2 THEN
                     FieldName = (Some Aggregate Sub Query),
                     FieldName2 = (Some other aggregate sub query)
                WHEN ActivityTypeID = 2 THEN
                     FieldName = (Some Aggregate Sub Query with diff result),
                     FieldName2 = (Some Other Aggregate Sub Query with diff result)
           END)

明らかに私は多くのクエリを省略しています、私はそれが可能かどうかを見たかっただけです。

私はおそらく「CASE」を2回だけ実行できることを知っていますが、私が尋ねると思いました...

4

4 に答える 4

34

The problem is that the CASE statement won't work in the way you're trying to use it. You can only use it to switch the value of one field in a query. If I understand what you're trying to do, you might need this:

SELECT 
   ActivityID,
   FieldName = CASE 
                  WHEN ActivityTypeID <> 2 THEN
                      (Some Aggregate Sub Query)
                  ELSE
                     (Some Aggregate Sub Query with diff result)
               END,
   FieldName2 = CASE
                  WHEN ActivityTypeID <> 2 THEN
                      (Some Aggregate Sub Query)
                  ELSE
                     (Some Aggregate Sub Query with diff result)
               END
于 2010-01-15T15:41:06.110 に答える
15

いいえ、CASEは関数であり、単一の値のみを返すことができます。CASEロジックを複製する必要があると思います。

もう1つのオプションは、クエリ全体をIFでラップし、2つの別々のクエリを使用して結果を返すことです。クエリの残りの部分を見ずに、それがあなたのために働くかどうかを言うのは難しいです。

于 2010-01-15T15:39:10.297 に答える
3

「ケース」は単一の値のみを返すことができますが、複合型を使用できます。

create type foo as (a int, b text);
select (case 1 when 1 then (1,'qq')::foo else (2,'ww')::foo end).*;
于 2016-11-22T08:21:12.663 に答える
2

実際、あなたはそれを行うことができます。

CASEただし、ステートメントを繰り返すことは見た目ほど悪くないことに注意する必要があります。SQL Server のクエリ オプティマイザは、CASE2 回実行しないほどスマートなので、そのためにパフォーマンスが低下することはありません。

さらに、誰かが次のロジックを使用して CASE を繰り返さないようにするかもしれません (それがあなたに合っている場合..)

INSERT INTO dbo.T1
(
    Col1,
    Col2,
    Col3
)
SELECT
    1,
    SUBSTRING(MyCase.MergedColumns, 0, CHARINDEX('%', MyCase.MergedColumns)),
    SUBSTRING(MyCase.MergedColumns, CHARINDEX('%', MyCase.MergedColumns) + 1, LEN(MyCase.MergedColumns) - CHARINDEX('%', MyCase.MergedColumns))
FROM
    dbo.T1 t
LEFT OUTER JOIN
(
    SELECT CASE WHEN 1 = 1 THEN '2%3' END MergedColumns
) AS MyCase ON 1 = 1

これにより、テーブル内の各レコードに値 (1、2、3) が挿入されますT1。これは、区切り文字を使用'%'してマージされた列を分割します。必要に応じて、独自の分割関数を作成できます (たとえば、null レコードを処理したり、varcharフィールドに複雑な区切り記号を使用したりする場合など)。ただし、主なロジックは、CASEステートメントを結合し、分割ロジックを使用して結合の結果セットから選択する必要があるということです。

于 2017-08-07T10:45:23.067 に答える