假设我有这个表,
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)