SQL Where子句条件

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)

1
你可以在where子句中使用case。 - Vijay Hulmani
7个回答

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

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


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,但我无法确定(根据问题中有限的信息)是否会出现重复。


0
我建议使用 case 语句。
CASE WHEN pv.SalePrice IS NULL THEN pv.SalePrice ELSE ' '

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

NVL是ORACLE数据库中的一个函数,用于将空值替换为指定的值。如果第一个参数不为空,则返回第一个参数;否则返回第二个参数。

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

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接