2013-09-28 105 views
-1

我有一個名爲SEN的列的Students表。 SEN包含每個記錄的S,A,P或N.在我的WHERE子句中,我想根據SEN中的值過濾我的結果集。我的SELECT語句包含一個名爲subgroup的變量,它由參數填充。我設法得到這個工作時過濾到某個值,是SEN列即:在OR子句的where子句中選擇case

SEN = CASE 
      WHEN @Subgroup = 'SENA' THEN 'A' 
      WHEN @Subgroup = 'SENP' THEN 'P' 
      WHEN @Subgroup = 'SENS' THEN 'S' 
      WHEN @Subgroup = 'SENNo' THEN 'N' 
     END 

,但我想過濾如果學生是A,P或S,並使用該參數值觸發此過濾器'SENYes'。我下面的代碼不起作用,但可以說明我要求的內容。

SEN = CASE 
      WHEN @Subgroup = 'SENYes' THEN 'A' OR 'P' OR 'S' 
      WHEN @Subgroup = 'SENA' THEN 'A' 
      WHEN @Subgroup = 'SENP' THEN 'P' 
      WHEN @Subgroup = 'SENS' THEN 'S' 
      WHEN @Subgroup = 'SENNo' THEN 'N' 
     END 

UPDATE:

用我的代碼中的IN操作符的工作:

SEN = CASE 
      WHEN @Subgroup = 'SENA' THEN 'A' 
      WHEN @Subgroup = 'SENP' THEN 'P' 
      WHEN @Subgroup = 'SENS' THEN 'S' 
      WHEN @Subgroup = 'SENNo' THEN 'N' 
     END 
    OR 
    (@SubGroup='SENYes' AND SEN IN ('A','P','S')) 
+0

你能給你想要的結果樣本記錄? –

+0

請問這個問題有什麼問題,它需要一個投票嗎?我想知道,所以我可以避免將來出現任何錯誤? – Matt

回答

1

您可以使用條件

Where 
(@SubGroup='SENYes' and SEN IN ('A','P','S')) 
OR 
(SEN = SubString(@SubGroup,4,1)) 

例如

declare @std table (SEN varchar(1)) 
Insert into @std 
Select 'A' 
UNION Select 'P' 
UNION Select 'S' 
UNION Select 'N' 

declare @Subgroup varchar(10) 
--change commented for testing 
--Select @SubGroup='SENA' 
Select @SubGroup='SENYes' 

Select * from @std 
Where 
(@SubGroup='SENYes' and SEN IN ('A','P','S')) 
OR 
(SEN = SubString(@SubGroup,4,1)) 
+0

謝謝@bummi這件作品像一個魅力,但我不知道它在做什麼。 – Matt

+0

你接受的記錄在哪裏(小組是SENYes和SEN中包含的A,P,S中的字符)或者(SEN是小組的第4個字符) – bummi

+0

啊我看到了,所以它是SENNO,你會返回N和SENYes會返回一個Y.我不需要返回Y,因爲它不在列值中。然而,'(@ SubGroup ='SENYes'和SEN IN('A','P','S'))'起作用,並且是我需要的唯一代碼。 – Matt

0
DECLARE @AllowedValues TABLE (SEN CHAR(1) PRIMARY KEY); 
IF @Subgroup IN ('SENA', 'SENP', 'SENS', 'SENNo') 
BEGIN 
    INSERT @AllowedValues (SEN) 
    VALUES (
     CASE 
      WHEN @Subgroup = 'SENA' THEN 'A' 
      WHEN @Subgroup = 'SENP' THEN 'P' 
      WHEN @Subgroup = 'SENS' THEN 'S' 
      WHEN @Subgroup = 'SENNo' THEN 'N' 
     END)  
END 
ELSE IF @Subgroup = 'SENYes' 
BEGIN 
    INSERT @AllowedValues (SEN) 
    SELECT 'A' UNION ALL 
    SELECT 'P' UNION ALL 
    SELECT 'S' 
END 
ELSE 
BEGIN 
    RAISERROR('Invalid subgroup', 16, 1); 
    RETURN; -- Needed if there is no TRY - CATCH 
END 

SELECT ... 
FROM ... 
WHERE SEN IN (SELECT v.SEN FROM @AllowedValues v); 
--     ^You need to use alias here to avoid nasty surprises 
+0

注意:您應該用正確的數據類型和最大值替換CHAR(1)。長度。 –