在WHERE子句中使用IsNull()

时间:2017-02-10 16:38:40

标签: 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)

返回:

ContactID    LeadSalePrice     ParkID
-------------------------------------
    1           50             NULL
    2           60              22

现在,我正在尝试为AND设置另一个ParkID子句。但是,我只想在AND IS NOT NULL的行上执行此ParkID。因此,如果在ParkID为空的行中,我们希望始终保留这些行。在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

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

= NULL

这是

IS NULL

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

AND p.ParkID = Isnull(p.ParkID, @ParkID)

我该怎么做?

2 个答案:

答案 0 :(得分:5)

只需检查p.ParkID NULL 是否与@ParkID匹配:

WHERE p.ParkID IS NULL
   OR p.ParkID = @ParkID

答案 1 :(得分:1)

更紧凑:

WHERE p.ParkID IN ('', NULL)