在sql where子句中;如果pv.SalePrice
是null
,我想使用pv.Price
。 我該怎麼做?SQL Where子句條件
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
。 我該怎麼做?SQL Where子句條件
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
返回其參數的第一個非空表達式。
WHERE
@FilterRangePriceValueMin < COALESCE(pv.SalePrice, pv.Price)
AND @FilterRangePriceValueMax > COALESCE(pv.SalePrice, pv.Price)
我建議使用case子句。
CASE WHEN pv.SalePrice IS NULL THEN pv.SalePrice ELSE ' '
這可能是一個延伸,因爲價格通常沒有索引,通常也不是好的索引候選人。但是,如果你有pv.SalePrice良好的可用指數,並在pv.Price另一個很好的使用索引和表很大,一個UNION
在這個運行超過COALESCE快得多:
SELECT
...
FROM ...
WHERE pv.SalePrice>[email protected]
AND pv.SalePrice<[email protected]
UNION
SELECT
...
FROM ...
WHERE pv.Price>[email protected]
AND pv.Price<[email protected]
這個想法是兩個索引查詢將比完整的表掃描更快。另外,如果可能的話,最好使用UNION ALL
,但是我無法確定(有限的信息)是否會重複。
如果我理解你,我不會嘗試,但可能會對你有用。
(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
你可以在where子句中使用case。 –