简单的SELECT QUERY与等于或不等于值

时间:2012-02-10 07:43:43

标签: sql tsql

假设我有这张表,

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

我在存储过程中只有一个参数。我需要传递一个参数@param。我需要选择所有等于A的行,或者选择所有不等于A的行。我只有一个参数@param。如果@param ='A'选择所有包含A和@param<>的行'A'选择所有不等于A的行。

修改

这是我发现的一种方法。 不确定哪种方法最佳

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
        ) 

4 个答案:

答案 0 :(得分:4)

因此,如果我理解正确,如果A的值确实为@param,您基本上希望选择等于A的所有行 - 如果不是A则选择所有其他行1}} ??

类似的东西:

 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 

答案 1 :(得分:2)

marc_s 建议的方法最容易遵循,最容易维护,并且要优化查询。
如果您坚持在单一陈述中执行此操作,则可以执行以下操作:

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

答案 2 :(得分: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)

答案 3 :(得分: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 tbl2.B=@Param
            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
    )