SQL查询,用于选择包含多个过滤器的表中的1个或所有记录

时间:2014-12-10 20:37:47

标签: sql-server tsql

是否有更简洁和可读的方法在存储过程中编写T-SQL查询,该过程将授予过程返回表中所有记录或仅一条记录的能力?

以下是我熟悉哪种方法的方法。在此示例中,存储过程将基于一个或多个过滤器从表中返回所有状态,或仅返回单个状态。不通过过滤器,它返回所有状态。应用StateID或StateAbbreviation过滤器,它将返回一条记录。

ALTER PROCEDURE [dbo].[StateGet]

@StateID int = null,
@StateAbbreviation varchar(3) = null

AS

BEGIN

    SELECT *
    FROM [dbo].[State]
    WHERE
        CASE WHEN @StateID = StateID THEN 1
             WHEN @StateID IS NULL THEN 1
        ELSE 0 END = 1
        AND
        CASE WHEN @StateAbbreviation = Abbreviation THEN 1
             WHEN @StateAbbreviation IS NULL THEN 1
        ELSE 0 END = 1

    /*
    -- Return all states
    exec dbo.StateGet
    -- Return 1 state (Minnesota)
    exec dbo.StateGet 24
    exec dbo.StateGet NULL, 'MN'
    */

END

我想使用比上面显示的更可读的语法。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

试试这段代码:

SELECT *
    FROM [dbo].[State]
    WHERE (@StateID is null or @StateID = StateID)
          AND
          (@StateAbbreviation is null or @StateAbbreviation = Abbreviation)

如果将@StateAbbreviation@StateAbbreviation作为null传递给存储过程,则会因条件之间的or操作数而忽略它。

  

@StateID = null

     

(@ StateID为null或@StateID = StateID)=> (true或其他)=>真