2012-02-10 96 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)))