在WHERE子句中使用IsNull()

Cas*_*ton 2 sql sql-server

这个查询:

SELECT
    sc.ContactID
    , c.Price
    , p.ParkID
    FROM
        tblc c
        JOIN tblsc ON c.ID= sc.ID
        LEFT JOIN tblp p ON sc.ID= p.ID
    WHERE
        (stuff = stuff)
        AND (stuff = stuff)
Run Code Online (Sandbox Code Playgroud)

返回此:

ContactID    LeadSalePrice     ParkID
-------------------------------------
    1           50             NULL
    2           60              22
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试为其设置另一个AND条款ParkID.但是,我只想ANDParkIDIS NOT NULL的行上执行此操作.因此,如果在ParkIDIS NULL的行上,我们希望始终保留这些行.在ParkID IS NOT NULL的行上,我们只想保留这些行,如果ParkID匹配参数.

如果@ParkID = 22,则返回两行.

如果@ParkID <> 22,那么只返回顶行.

如果@ParkID = NULL,则返回两行.

我试过这个:

SELECT
    sc.ContactID
    , c.Price
    , p.ParkID
FROM
    tblc c
    JOIN tblsc ON c.ID= sc.ID
    LEFT JOIN tblp p ON sc.ID= p.ID
    WHERE 
        (stuff = stuff)
        AND (stuff = stuff)
        AND p.ParkID = 
            CASE WHEN p.ParkID IS NULL THEN 
                NULL
           ELSE
                @ParkID
            END
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为与null比较的正确方法不是:

= NULL
Run Code Online (Sandbox Code Playgroud)

它的

IS NULL
Run Code Online (Sandbox Code Playgroud)

出于同样的原因(我假设),这也不起作用:

AND p.ParkID = Isnull(p.ParkID, @ParkID)
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

Ren*_*ogt 5

简单的检查,如果p.ParkIDNULL 还是它匹配@ParkID:

WHERE p.ParkID IS NULL
   OR p.ParkID = @ParkID
Run Code Online (Sandbox Code Playgroud)