在sql where子句中;如果pv.SalePrice
是null
,我想使用pv.Price
。
我怎么能这样做?
WHERE
@FilterRangePriceValueMin < pv.SalePrice OR pv.SalePrice is null
AND (@FilterRangePriceValueMax > pv.SalePrice OR pv.SalePrice is null)
答案 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