2013-01-02 116 views
3

在sql where子句中;如果pv.SalePricenull,我想使用pv.Price。 我該怎麼做?SQL Where子句條件

WHERE  
    @FilterRangePriceValueMin < pv.SalePrice OR pv.SalePrice is null 
    AND (@FilterRangePriceValueMax > pv.SalePrice OR pv.SalePrice is null) 
+1

你可以在where子句中使用case。 –

回答

11

可以使用COALESCE功能嘗試,以便NULL項目,然後在第一個非空的一個比較。您還可以使用BETWEEN避免寫出調用兩次:

WHERE 
    COALESCE(pv.SalePrice, pv.Price) 
    BETWEEN @FilterRangePriceValueMin AND @FilterRangePriceValueMax 
3

您可以使用COALESCE返回其參數的第一個非空表達式。

WHERE  
    @FilterRangePriceValueMin < COALESCE(pv.SalePrice, pv.Price) 
    AND @FilterRangePriceValueMax > COALESCE(pv.SalePrice, pv.Price) 
1

使用CASE聲明

@FilterRangePriceValueMin < (CASE WHEN pv.SalePrice IS NULL THEN pv.Price ELSE pv.SalePrice END) OR pv.SalePrice is null 
AND (@FilterRangePriceValueMax > (CASE WHEN pv.SalePrice IS NULL THEN pv.Price ELSE pv.SalePrice END) OR pv.SalePrice is null) 

或者你可以使用COALESCE

返回其參數中第一個非空表達式。

0

我建議使用case子句。

CASE WHEN pv.SalePrice IS NULL THEN pv.SalePrice ELSE ' ' 
1

這可能是一個延伸,因爲價格通常沒有索引,通常也不是好的索引候選人。但是,如果你有pv.SalePrice良好的可用指數,並在pv.Price另一個很好的使用索引和表很大,一個UNION在這個運行超過COALESCE快得多:

SELECT 
    ... 
    FROM ... 
    WHERE pv.SalePrice>[email protected] 
    AND pv.SalePrice<[email protected] 
UNION 
SELECT 
    ... 
    FROM ... 
    WHERE pv.Price>[email protected] 
    AND pv.Price<[email protected] 

這個想法是兩個索引查詢將比完整的表掃描更快。另外,如果可能的話,最好使用UNION ALL,但是我無法確定(有限的信息)是否會重複。

0

如果我理解你,我不會嘗試,但可能會對你有用。

(pv.SalePrice is not null and (@FilterRangePriceValueMin < pv.SalePrice AND @FilterRangePriceValueMax > pv.SalePrice)) 
or 
(pv.SalePrice is null and (@FilterRangePriceValueMin < pv.Price AND (@FilterRangePriceValueMax > pv.Price)) 
0

使用IFNULL ---------另一種方法>MYSQL

WHERE 
    IFNULL(pv.SalePrice, pv.Price) 
    BETWEEN @FilterRangePriceValueMin AND @FilterRangePriceValueMax 

NVL -------------------- ------->ORACLE

WHERE 
    NVL(pv.SalePrice, pv.Price) 
    BETWEEN @FilterRangePriceValueMin AND @FilterRangePriceValueMax 

ISNULL --------------------------->SQL SERVER

WHERE 
    ISNULL(pv.SalePrice, pv.Price) 
    BETWEEN @FilterRangePriceValueMin AND @FilterRangePriceValueMax