3

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

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

7 回答 7

11

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

WHERE
    COALESCE(pv.SalePrice, pv.Price)
    BETWEEN @FilterRangePriceValueMin AND @FilterRangePriceValueMax
于 2013-01-02T14:18:10.057 回答
3

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

WHERE    
   @FilterRangePriceValueMin < COALESCE(pv.SalePrice, pv.Price) 
   AND @FilterRangePriceValueMax > COALESCE(pv.SalePrice, pv.Price) 
于 2013-01-02T14:19:08.203 回答
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

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

于 2013-01-02T14:21:29.533 回答
1

这可能有点牵强,因为价格通常没有指数化,通常不是很好的指数候选者。但是,如果您在 pv.SalePrice 上有一个很好的可用索引,并且在 pv.Price 上有另一个很好的可用索引,并且您的表很大,那么 a UNIONon this 将比 COALESCE 运行得快得多:

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

这个想法是两个索引查询将比完整的表扫描更快。此外,如果可能的话最好使用UNION ALL,但我无法判断(从有限的信息中)你是否会得到重复。

于 2013-01-02T14:25:36.673 回答
0

我建议使用 case 子句。

CASE WHEN pv.SalePrice IS NULL THEN pv.SalePrice ELSE ' '
于 2013-01-02T14:25:29.440 回答
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 ) )
于 2013-01-02T14:31:35.547 回答
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
于 2013-01-02T14:59:22.790 回答