164

いろいろと探してみましたが、参考になりそうなものは見つかりませんでした。

私はSQLでこれをやろうとしています:

declare @locationType varchar(50);
declare @locationID int;

SELECT column1, column2
FROM viewWhatever
WHERE
CASE @locationType
    WHEN 'location' THEN account_location = @locationID
    WHEN 'area' THEN xxx_location_area = @locationID
    WHEN 'division' THEN xxx_location_division = @locationID

それぞれの最後に「= @locationID」を付ける必要がないことはわかっていますが、正しい構文にさえ近づくことができません。SQL は、最初の WHEN 行の「=」について不平を言い続けます...

これどうやってするの?

4

13 に答える 13

206
declare @locationType varchar(50);
declare @locationID int;

SELECT column1, column2
FROM viewWhatever
WHERE
@locationID = 
  CASE @locationType
      WHEN 'location' THEN account_location
      WHEN 'area' THEN xxx_location_area 
      WHEN 'division' THEN xxx_location_division 
  END
于 2008-10-15T21:10:00.057 に答える
78

ケースステートメントなし..。

SELECT column1, column2
FROM viewWhatever
WHERE
    (@locationType = 'location' AND account_location = @locationID)
    OR
    (@locationType = 'area' AND xxx_location_area = @locationID)
    OR
    (@locationType = 'division' AND xxx_location_division = @locationID)
于 2009-05-13T15:33:31.183 に答える
43

どうぞ。

SELECT
   column1, 
   column2
FROM
   viewWhatever
WHERE
CASE 
    WHEN @locationType = 'location' AND account_location = @locationID THEN 1
    WHEN @locationType = 'area' AND xxx_location_area = @locationID THEN 1
    WHEN @locationType = 'division' AND xxx_location_division = @locationID THEN 1
    ELSE 0
END = 1
于 2008-10-15T22:08:04.493 に答える
6

これは、テーブル構造に欠陥があることを示していると言えます。おそらく、さまざまな場所の種類をさまざまなテーブルに分けて、より豊富なクエリを実行し、余分な列を回避できるようにする必要があります。

構造を変更できない場合は、次のようなものが機能する可能性があります。

SELECT
    *
FROM
    Test
WHERE
    Account_Location = (
        CASE LocationType
          WHEN 'location' THEN @locationID
          ELSE Account_Location
        END
    )
    AND
    Account_Location_Area = (
        CASE LocationType
          WHEN 'area' THEN @locationID
          ELSE Account_Location_Area
        END
    )

などなど... クエリの構造をオンザフライで変更することはできませんが、述語を等しくすることでオーバーライドできます。

編集:もちろん、上記の提案ははるかに優れています。私のものは無視してください。

于 2008-10-15T21:12:37.680 に答える
6

これに関する問題は、SQL エンジンが式を評価するときに、FROM 部分をチェックして適切なテーブルをプルし、次に WHERE 部分をチェックしていくつかの基本条件を提供するため、どの列の動的条件を適切に評価できないことです。に対してチェックします。

次のように、述語の WHERE 条件をチェックするときに WHERE 句を使用できます。

WHERE account_location = CASE @locationType
                              WHEN 'business' THEN 45
                              WHEN 'area' THEN 52
                         END

したがって、特定のケースでは、クエリをストアド プロシージャに入れるか、3 つの個別のクエリを作成する必要があります。

于 2008-10-15T21:13:20.877 に答える
3

このクエリを試してください。上記の投稿への回答:

select @msgID, account_id
    from viewMailAccountsHeirachy
    where 
    CASE @smartLocationType
        WHEN 'store' THEN account_location
        WHEN 'area' THEN xxx_location_area 
        WHEN 'division' THEN xxx_location_division 
        WHEN 'company' THEN xxx_location_company 
    END  = @smartLocation
于 2011-05-31T06:16:17.847 に答える
2

これを試して:

WHERE (
    @smartLocationType IS NULL 
    OR account_location = (
         CASE
            WHEN @smartLocationType IS NOT NULL 
                 THEN @smartLocationType
            ELSE account_location 
         END
    )
)
于 2012-01-27T09:24:16.633 に答える
-2

このクエリを試してください。その非常に理解しやすい:

CREATE TABLE PersonsDetail(FirstName nvarchar(20), LastName nvarchar(20), GenderID int);
GO

INSERT INTO PersonsDetail VALUES(N'Gourav', N'Bhatia', 2),
              (N'Ramesh', N'Kumar', 1),
              (N'Ram', N'Lal', 2),
              (N'Sunil', N'Kumar', 3),
              (N'Sunny', N'Sehgal', 1),
              (N'Malkeet', N'Shaoul', 3),
              (N'Jassy', N'Sohal', 2);
GO

SELECT FirstName, LastName, Gender =
    CASE GenderID
    WHEN 1 THEN 'Male'
    WHEN 2 THEN 'Female'
    ELSE 'Unknown'
    END
FROM PersonsDetail
于 2015-02-03T11:21:11.960 に答える