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