SQL Where子句中的Switch/Case

179

我试图进行搜索,但是无法找到任何有助于我的东西。

我正在尝试在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行上的“=”......

我该怎么做?

14个回答

0

通常情况下,您可以通过以下方式管理不同的条件语句的情况

SELECT *
FROM viewWhatever
WHERE 1=(CASE <case column or variable>
             WHEN '<value1>' THEN IIF(<where condition 1>,1,0)
             WHEN '<value2>' THEN IIF(<where condition 2>,1,0)
             ELSE IIF(<else condition>,1,0)
         END)

-1
Case Statement in SQL Server Example

Syntax

CASE [ expression ]

   WHEN condition_1 THEN result_1
   WHEN condition_2 THEN result_2
   ...
   WHEN condition_n THEN result_n

   ELSE result

END

Example

SELECT contact_id,
CASE website_id
  WHEN 1 THEN 'TechOnTheNet.com'
  WHEN 2 THEN 'CheckYourMath.com'
  ELSE 'BigActivities.com'
END
FROM contacts;

OR

SELECT contact_id,
CASE
  WHEN website_id = 1 THEN 'TechOnTheNet.com'
  WHEN website_id = 2 THEN 'CheckYourMath.com'
  ELSE 'BigActivities.com'
END
FROM contacts;

4
被踩是因为答案与问题无关。问题是如何在WHERE子句中使用CASE,而不是如何在SELECT的列上使用CASE。 - ArturoTena

-1

这对我有用。

CREATE TABLE PER_CAL( CAL_YEAR INT,CAL_PER INT) INSERT INTO PER_CAL(CAL_YEAR,CAL_PER)VALUES(20,1),(20,2),(20,3),(20,4),(20,5),(20,6),(20,7),(20,8),(20,9),(20,10),( 20,11),(20,12), (99,1),(99,2),(99,3),(99,4),(99,5),(99,6),(99,7),(99,8),(99,9),(99,10),(99,11),(99,12)

四位数的世纪由以下规则确定:如果年份为50或更多,则世纪为1900,否则为2000。

给定标记开始和结束期间(如一个季度)的两个6位数字周期,在该范围内返回行。

-- 2020年第1季度 SELECT * FROM PER_CAL WHERE ((CASE WHEN CAL_YEAR > 50 THEN 1900 ELSE 2000 END + CAL_YEAR) * 100 + CAL_PER) BETWEEN 202001 AND 202003 -- 1999年第4季度 SELECT * FROM PER_CAL WHERE ((CASE WHEN CAL_YEAR > 50 THEN 1900 ELSE 2000 END + CAL_YEAR) * 100 + CAL_PER) BETWEEN 199910 AND 199912

-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

1
读到这篇回答的人:它与上面 @bob-prost 的被接受的答案相同:https://dev59.com/uHVC5IYBdhLWcg3wtzgQ#206500 因为这个原因被投票反对。 - ArturoTena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接