SQL Where子句在传递值时使用

Dev*_*per 1 sql t-sql sql-server sql-server-2014

我有以下情况.

如果将值传递给@UserId参数,则需要过滤这些用户记录.

如果没有传递值,那么我需要带上所有记录.

列RecipientId不是NULL.

但是,即使我传递了值,查询下面也会返回所有记录.

DECLARE @UserId INT

SET @UserId = 47

SELECT *
FROM Message MR
WHERE MR.CompanyId = 1
    AND (
        MR.RecipientId IS NOT NULL
        OR MR.RecipientId = @UserId
        )
Run Code Online (Sandbox Code Playgroud)

scs*_*mon 5

只需在变量上使用布尔表达式

declare @UserId  int = null

SELECT *
FROM Message MR
WHERE MR.CompanyId = 1 and (MR.RecipientID = @UserId or @UserId IS NULL)
Run Code Online (Sandbox Code Playgroud)

  • 该列是否为null无关紧要.如果参数为NULL,则满足OR条件并返回所有MR.RecipientID.无论如何NULL <> NULL,因此列的无效能力与此运算符无关. (2认同)