在 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)
在 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)
您可以使用该COALESCE
函数按顺序尝试项目NULL
,然后将第一个非空的项目进行比较。您还可以使用BETWEEN
来避免两次写出调用:
WHERE
COALESCE(pv.SalePrice, pv.Price)
BETWEEN @FilterRangePriceValueMin AND @FilterRangePriceValueMax
您可以使用COALESCE
which 在其参数中返回第一个非空表达式。
WHERE
@FilterRangePriceValueMin < COALESCE(pv.SalePrice, pv.Price)
AND @FilterRangePriceValueMax > COALESCE(pv.SalePrice, pv.Price)
使用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
返回其参数中的第一个非空表达式。
这可能有点牵强,因为价格通常没有指数化,通常不是很好的指数候选者。但是,如果您在 pv.SalePrice 上有一个很好的可用索引,并且在 pv.Price 上有另一个很好的可用索引,并且您的表很大,那么 a UNION
on 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
,但我无法判断(从有限的信息中)你是否会得到重复。
我建议使用 case 子句。
CASE WHEN pv.SalePrice IS NULL THEN pv.SalePrice ELSE ' '
如果我理解你,我不会尝试,但它可能对你有用。
(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 ) )
另一种方法使用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