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



假设我有这个表,

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
        ) 

如果我理解正确的话,如果@param的值确实是A,那么你基本上想选择所有等于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 

marc_s建议的方法是最清晰、最容易维护和优化查询的方法
如果你坚持在一句话中做这件事,你可以做以下事情:

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

也许是这样的:

首先一些测试数据:

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
    )

您可以尝试这样的方法。请尝试修改此查询,您可能会得到结果。

  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)

最新更新