SQL Where子句条件

时间:2013-01-02 14:16:13

标签: c# sql where where-clause

在sql where子句中;如果pv.SalePricenull,我想使用pv.Price。 我怎么能这样做?

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

7 个答案:

答案 0 :(得分:11)

您可以使用COALESCE函数按顺序尝试NULL的项目,然后将第一个非空的项目进行比较。您也可以使用BETWEEN来避免两次拨出电话:

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

答案 1 :(得分:3)

您可以使用COALESCE在其参数中返回第一个非空表达式。

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

答案 2 :(得分: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

  

返回其参数中的第一个非空表达式。

答案 3 :(得分:1)

这可能是一个延伸,因为价格通常没有被编入索引,通常不是很好的指数候选者。但是,如果你在pv.SalePrice上有一个很好的可用索引,并且在pv.Price上有另一个好的可用索引,并且你的表很大,那么 UNION 的运行速度会比COALESCE:

SELECT
   ...
   FROM ...
   WHERE pv.SalePrice>=@FilterRangePriceValueMin 
     AND pv.SalePrice<=@FilterRangePriceValueMax
UNION
SELECT
   ...
   FROM ...
   WHERE pv.Price>=@FilterRangePriceValueMin
     AND pv.Price<=@FilterRangePriceValueMax

这个想法是两个索引查询比完整的表扫描更快。此外,如果可能的话,最好使用UNION ALL,但我不能告诉(如有问题的有限信息)你是否会重复。

答案 4 :(得分:0)

我建议使用case子句。

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

答案 5 :(得分: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 ) )

答案 6 :(得分:0)

使用IFNULL的另一种方法---------&gt; MYSQL

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

NVL ---------------------------&gt; ORACLE

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

ISNULL ---------------------------&gt; SQL SERVER

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