2012-02-10 17 views
0

讓說我有這個表,簡單的SELECT查詢不EqualTo一個價值

A B 
------- 
1 A 
2 C 
3 A 
4 NULL 
5 B 
6 A 

我只有在存儲過程的參數。我需要傳遞一個參數@param。我需要選擇所有等於A的行或選擇不等於A的所有行。我只有一個參數@param。如果@param = 'A' 與選擇A的所有行如果@param <> 'A' 選擇具有不等於所有行A.

編輯:

這裏是1點的方法,我已經找到。 不確定哪個方法是最好的一個

DECLARE @Param VARCHAR(5)='NOt A' 

DECLARE @tbl TABLE(A INT,B VARCHAR(5)) 

INSERT INTO @tbl(A,B) 
VALUES 
    (1,'A'), 
    (2,'C'), 
    (3,'A'), 
    (4,NULL), 
    (5,'B'), 
    (6,'A') 

SELECT * 
FROM @tbl 
WHERE 1 = 
     (
      CASE WHEN @param = 'A' 
        THEN 
        (
         CASE WHEN B = 'A' THEN 1 ELSE 2 END 
        ) 
        ELSE 
        (
         CASE WHEN (B IS NULL OR B <> 'A') THEN 1 ELSE 2 END 
        ) 
        END 
     ) 
+0

@marc_s,從應用程序中傳遞。應用程序只傳遞A或不A – user960567 2012-02-10 07:46:41

+0

選擇等於'A'或不等於'A'的所有行將導致選擇所有行。這是你真正想要的嗎? – TPete 2012-02-10 07:47:56

+0

@TPete,當應用程序通過A時,我需要選擇所有行與A,反之亦然 – user960567 2012-02-10 07:48:44

回答

4

所以,如果我理解正確的話,你基本上要選擇所有的行等於A如果@param值的確A - 和所有其他行,如果它不是A

喜歡的東西:

CREATE PROCEDURE dbo.SelectRows @Param CHAR(1) 
AS 
BEGIN 
    IF @Param = 'A' THEN 

    SELECT A, B 
    FROM dbo.YourTable 
    WHERE B = 'A' 

    ELSE 

    SELECT A, B 
    FROM dbo.YourTable 
    WHERE B <> 'A' OR B IS NULL 

END 
+0

這是不可能的一個查詢?與CASE等 – user960567 2012-02-10 07:49:57

+0

@ user960567:我不這麼認爲,因爲你曾經想根據**平等**選擇 - 另一次是**不平等** - 這些不只是不同的值,這些是不同的條件。'CASE'非常好,如果你有幾個不同的**值可供選擇... – 2012-02-10 07:51:05

+0

謝謝,馬克... – user960567 2012-02-10 07:52:59

1

你可以嘗試這樣的事情。請嘗試修改此查詢,您可能會得到結果。

SELECT A, B 
     FROM dbo.YourTable 
     WHERE B IN (CASE WHEN @Param='A' THEN 'A' ELSE 
         (SELECT B FROM yourTable where B<>'A' OR B IS NULL) END) 
+1

也添加B IS NULL。 – kbvishnu 2012-02-10 07:56:04

+0

我已經嘗試過類似B =(CASE WHEN @ Param ='A'然後'A'ELSE B END)。但這裏是空問題 – user960567 2012-02-10 07:58:16

+0

請找到更新的答案 – kbvishnu 2012-02-11 08:52:31

1

也許是這樣的:

首先是一些測試數據:

DECLARE @tbl TABLE(A INT,B VARCHAR(5)) 

INSERT INTO @tbl(A,B) 
VALUES 
    (1,'A'), 
    (2,'C'), 
    (3,'A'), 
    (4,NULL), 
    (5,'B'), 
    (6,'A') 

於是這樣的查詢:

DECLARE @Param VARCHAR(5)='A' 

SELECT 
    * 
FROM 
    @tbl AS tbl 
WHERE EXISTS 
    (
     SELECT 
      1 
     FROM 
      @tbl AS tbl2 
     WHERE 
      @Param='A' 
      AND [email protected] 
      AND tbl.A=tbl2.A 
     UNION ALL 
     SELECT 
      1 
     FROM 
      @tbl AS tbl3 
     WHERE 
      (NOT @Param='A' OR @Param IS NULL) 
      AND (tbl.B<>'A' OR tbl.B IS NULL) 
      AND tbl.A=tbl3.A 
    ) 
+0

它比marc的方法更復雜 – user960567 2012-02-10 09:38:34

+1

你想要它一個查詢..對嗎?那麼它可能會更復雜 – Arion 2012-02-10 09:43:17

+0

我的方法呢。看到編輯的問題 – user960567 2012-02-10 09:52:46

2

通過marc_s建議的做法是最清楚的遵循和最簡單的維護和查詢進行優化。
如果你堅持在一個聲明中這樣做,你可以做類似如下:

select A, B 
from @tbl 
where ((@Param='A') and (B='A')) 
    or ((@Param<>'A') and ((B<>'A') or (B is null)))