SQL切换/案例在where子句中

我试着四处搜寻,但找不到任何能帮助我的东西。

我试图在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行…

帮帮我!

 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 

没有案件陈述…

 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) 

干得好。

 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 

我会说这是一个有缺陷的表结构的指标。 也许不同的位置types应该分开放置在不同的表格中,这样你可以做更多更丰富的查询,也可以避免使用多余的列。

如果你无法改变结构,像下面这样的东西可能会工作:

 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 ) 

等等……我们不能dynamic地改变查询的结构,但是我们可以通过使谓词等于它们来覆盖它。

编辑:以上的build议当然好多了,只是忽略我的。

这个问题是,当SQL引擎去评估expression式时,它会检查FROM部分来拉取正确的表,然后WHERE部分提供一些基准,所以它不能正确评估dynamic条件检查。

在检查谓词中的WHERE条件时,可以使用WHERE子句,如

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

所以在你的特定情况下,你将需要把查询放入存储过程或创build三个单独的查询。

或者运营商可以select在何种情况下的情况

 ALTER PROCEDURE [dbo].[RPT_340bClinicDrugInventorySummary] -- Add the parameters for the stored procedure here @ClinicId BIGINT = 0, @selecttype int, @selectedValue varchar (50) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; SELECT drugstock_drugname.n_cur_bal,drugname.cdrugname,clinic.cclinicname FROM drugstock_drugname INNER JOIN drugname ON drugstock_drugname.drugnameid_FK = drugname.drugnameid_PK INNER JOIN drugstock_drugndc ON drugname.drugnameid_PK = drugstock_drugndc.drugnameid_FK INNER JOIN drugndc ON drugstock_drugndc.drugndcid_FK = drugndc.drugid_PK LEFT JOIN clinic ON drugstock_drugname.clinicid_FK = clinic.clinicid_PK WHERE (@ClinicId = 0 AND 1 = 1) OR (@ClinicId != 0 AND drugstock_drugname.clinicid_FK = @ClinicId) -- Alternative Case When You can use OR AND ((@selecttype = 1 AND 1 = 1) OR (@selecttype = 2 AND drugname.drugnameid_PK = @selectedValue) OR (@selecttype = 3 AND drugndc.drugid_PK = @selectedValue) OR (@selecttype = 4 AND drugname.cdrugclass = 'C2') OR (@selecttype = 5 AND LEFT(drugname.cdrugclass, 1) = 'C')) ORDER BY clinic.cclinicname, drugname.cdrugname END 

请尝试这个查询。 回答以上post:

 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 

尝试这个:

 WHERE ( @smartLocationType IS NULL OR account_location = ( CASE WHEN @smartLocationType IS NOT NULL THEN @smartLocationType ELSE account_location END ) ) 
 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; 

试试这个查询。 它很容易理解:

 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