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、比較のために最初の非 null アイテムを取得できます。BETWEEN呼び出しを 2 回書き出すのを避けるために使用することもできます。

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

COALESCE引数で最初の非 null 式を返す whichを使用できます。

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

引数の中で最初の非 null 式を返します。

于 2013-01-02T14:21:29.533 に答える
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

2 つのインデックス クエリは、完全なテーブル スキャンよりも高速になるという考えです。また、可能であれば使用するのが最善UNION ALLですが、(問題の限られた情報から)重複するかどうかはわかりません。

于 2013-01-02T14:25:36.673 に答える
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 に答える
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

case 句を使用することをお勧めします。

CASE WHEN pv.SalePrice IS NULL THEN pv.SalePrice ELSE ' '
于 2013-01-02T14:25:29.440 に答える