1

我在 MS SQL 2008 中有一个表,其中有一列名为Status. 它可以有“A”或“I”或“P”作为值。@Status我有一个作为参数的存储过程。如果参数是null,我需要检索状态为 A 或 I 或 P 的所有记录(基本上忽略 Status 字段)。如果参数只有 A(例如),我只需要获取状态为 A 的记录。如何在没有 SELECT 语句的情况下完成此操作IF.. ELSE

 -- This is just a snippet of a larger query. 
 -- Can the following be done without IF ELSE?
    IF @Status = NULL
       BEGIN
         SELECT * FROM Person
       END
    ELSE SELECT * FROM Person WHERE Status = @Status

编辑:我的目标不是重复相同的逻辑两次。select 语句有一堆连接和东西,我不想在 else 条件下再次重复它。

编辑#2:我的错-我再次检查了表格,它确实包含带有NULL状态的记录,这是我不想要的。这是桌子——

Id      Status
--------------
1        A
2        I
3        P
4        NULL

如果@Status是“-1”(我将参数默认为-1),我想要1, 2, 3记录。如何编写查询?

4

5 回答 5

1

您可以使用 OR:

SELECT * FROM Person WHERE Status = @Status OR @Status IS NULL

或联合所有:

SELECT * FROM Person WHERE Status = @Status
UNION ALL
SELECT * FROM Person WHERE @Status IS NULL
于 2012-04-25T19:03:54.273 回答
1

第三种选择:

SELECT * FROM dbo.Person WHERE Status = COALESCE(@Status, Status);

或者您可能更喜欢 ISNULL:

SELECT * FROM dbo.Person WHERE Status = ISNULL(@Status, Status);

并且只是为了完整性,虽然这里的选择性不太可能证明它是合理的,但您可能会发现 @Status IS NULL 和 @Status IS NOT NULL 的计划差异很大,以至于用一个或另一个缓存计划可能会导致性能不佳在相反的情况下。处理此问题的一种方法是动态 SQL。因此,再次声明,在您的情况下这可能是一个不错的选择,它是这些计划固定 COALESCE/ISNULL/OR 选项的常用替代方案。

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = N'SELECT * FROM dbo.Person' + 
  COALESCE(N' WHERE Status = ''' + CONVERT(VARCHAR(12), @Status) + '''', '');

PRINT @sql;
--EXEC sp_executesql @sql;

当然你知道你不应该在生产代码中使用 SELECT *,对吧?

于 2012-04-25T19:06:31.713 回答
0
SELECT * FROM Person WHERE @Status IS NULL OR Status = @Status
于 2012-04-25T19:04:54.763 回答
0

这应该这样做:

select * from Person
where (@Status is not null and Status = @Status) or
      (@Status is null and Status in ('A', 'I', 'P')) 
于 2012-04-25T19:38:00.863 回答
0
declare @status CHAR(1)
set @status = 'A'
select * from Person where (@status IS null) or (@status = status)

当@status = NULL 时,此查询返回所有记录。

于 2012-04-25T19:22:03.460 回答