1

式を返す「 SearchedCASEexpression」を含むCASEステートメントを使用してWHERE句に条件付きロジックを適用しようとしていますが、 WHERE句は代わりに「 SearchCondition 」を予期しているため、機能しません。下記参照。

WHERE句で「SearchedCASEexpression」を使用し、代わりに「SearchCondition」を返すようにするにはどうすればよいですか?」

WHERE
(
    --user supplies both min and max price
    CASE 
        WHEN (@MIN_PRICE IS NOT NULL AND @MAX_PRICE IS NOT NULL AND @MIN_PRICE > 0 AND @MAX_PRICE > 0) THEN
            CASE 
                WHEN LIST_STATUS = 'Sold' THEN
                    SOLD_PRICE BETWEEN @MIN_PRICE AND @MAX_PRICE
                ELSE --Active and Contingent
                    CASE 
                        WHEN VALUE_RANGE_PRICING = 'No' THEN
                            LIST_PRICE_H BETWEEN @MIN_PRICE AND @MAX_PRICE
                        ELSE --Price Range
                            LOW_LIST_PRICE BETWEEN @MIN_PRICE AND @MAX_PRICE
                            OR
                            LIST_PRICE_H BETWEEN @MIN_PRICE AND @MAX_PRICE
                    END
            END
        --user supplies just max price
        WHEN ((@MIN_PRICE IS NULL OR @MIN_PRICE = 0) AND @MAX_PRICE IS NOT NULL AND @MAX_PRICE > 0) THEN
            CASE 
                WHEN LIST_STATUS = 'Sold' THEN
                    SOLD_PRICE <= @MAX_PRICE
                ELSE --Active and Contingent
                    CASE 
                        WHEN VALUE_RANGE_PRICING = 'No' THEN
                            SEARCH_PRICE <= @MAX_PRICE
                        ELSE --Price Range
                            LOW_LIST_PRICE <= @MAX_PRICE
                    END
            END
        --user supplies just min price
        WHEN ((@MAX_PRICE IS NULL OR @MAX_PRICE = 0) AND @MIN_PRICE IS NOT NULL AND @MIN_PRICE > 0) THEN
            CASE 
                WHEN LIST_STATUS = 'Sold' THEN
                    SOLD_PRICE >= @MIN_PRICE
                ELSE --Active and Contingent
                    CASE 
                        WHEN VALUE_RANGE_PRICING = 'No'
                            SEARCH_PRICE >= @MIN_PRICE
                        ELSE --Price Range
                            LIST_PRICE_H >= @MIN_PRICE
                    END
            END
        --else {do nothing} as no min/max prices supplied
    END
)
4

2 に答える 2

1

ブール式を整数に変換する必要があります。true の場合は 1、false の場合は 0 で、それらを 1 と比較して再度ブール値を取得します。と言うとできますcase when EXPRESSION then 1 else 0 end

このようなもの:

where 
case 
   when situation1 then
             case when condition1  then 1 
              else 0 
              end
    when situation2 then 
          case when conditon2 then 1
              else 0 end
    else 0 end
 = 1

あなたの例では:

そのようです:

WHERE
(
    --user supplies both min and max price
    CASE 
        WHEN (@MIN_PRICE IS NOT NULL AND @MAX_PRICE IS NOT NULL AND @MIN_PRICE > 0 AND @MAX_PRICE > 0) THEN
            CASE 
                WHEN LIST_STATUS = 'Sold' THEN
                    case when SOLD_PRICE BETWEEN @MIN_PRICE AND @MAX_PRICE then 1 else 0 end
                ELSE --Active and Contingent
                    CASE 
                        WHEN VALUE_RANGE_PRICING = 'No' THEN
                            case when LIST_PRICE_H BETWEEN @MIN_PRICE AND @MAX_PRICE then 1 else 0 end
                        ELSE --Price Range
                        case when 
                            LOW_LIST_PRICE BETWEEN @MIN_PRICE AND @MAX_PRICE
                            OR
                            LIST_PRICE_H BETWEEN @MIN_PRICE AND @MAX_PRICE
                            then 1 else 0 end
                    END
            END
        --user supplies just max price
        WHEN ((@MIN_PRICE IS NULL OR @MIN_PRICE = 0) AND @MAX_PRICE IS NOT NULL AND @MAX_PRICE > 0) THEN
            CASE 
                WHEN LIST_STATUS = 'Sold' THEN
                    case when SOLD_PRICE <= @MAX_PRICE then 1 else 0 end
                ELSE --Active and Contingent
                    CASE 
                        WHEN VALUE_RANGE_PRICING = 'No' THEN
                            case when SEARCH_PRICE <= @MAX_PRICE then 1 else 0 end
                        ELSE --Price Range
                            case when LOW_LIST_PRICE <= @MAX_PRICE then 1 else 0 end
                    END
            END
        --user supplies just min price
        WHEN ((@MAX_PRICE IS NULL OR @MAX_PRICE = 0) AND @MIN_PRICE IS NOT NULL AND @MIN_PRICE > 0) THEN
            CASE 
                WHEN LIST_STATUS = 'Sold' THEN
                    case when SOLD_PRICE >= @MIN_PRICE then 1 else 0 end
                ELSE --Active and Contingent
                    CASE 
                        WHEN VALUE_RANGE_PRICING = 'No' Then 
                            case when SEARCH_PRICE >= @MIN_PRICE then 1 else 0 end
                        ELSE --Price Range
                            case when LIST_PRICE_H >= @MIN_PRICE then 1 else 0 end
                    END
            END
        --else {do nothing} as no min/max prices supplied
    END
    = 1
)

タイプミスがないか注意して読んでください....

また、これはインデックスを使用しないことに注意してください。インデックスを使用するには、ユニオンに分割するか、一時テーブルを使用します。

于 2012-12-17T23:52:07.870 に答える
1

以下は機能的に同等であるべきだと思います。

MONEYこれは、使用される値がデータ型のものであると想定しています...そうでない場合は、ここで使用される最小/最大値を、使用されているデータ型の値に調整できます。

-- First, set the min / max magic numbers for the MONEY data type.
DECLARE
    @MinMoney MONEY,
    @MaxMoney MONEY

SET @MinMoney = -922,337,203,685,477.5808
SET @MaxMoney = 922,337,203,685,477.5807


-- Then later in your query...
WHERE
(
    CASE 
        -- First, handle the "no parameters supplied scenario" by returning NULL,
        --  which will cause the following check to fail.
        WHEN @MIN_PRICE IS NULL AND @MAX_PRICE IS NULL THEN NULL

        -- Next, supply the values for the various statuses.
        WHEN LIST_STATUS = 'Sold' THEN SOLD_PRICE
        WHEN VALUE_RANGE_PRICING = 'No' THEN LIST_PRICE_H
        ELSE LOW_LIST_PRICE

    -- Lastly, check if the supplied value falls within the range.  
    -- If a value isn't supplied, convert it to either the min or max value.
    END BETWEEN 
        ISNULL(NULLIF(@MIN_PRICE, 0), @MinMoney) 
        AND ISNULL(NULLIF(@MAX_PRICE, 0), @MaxMoney)
)
于 2012-12-17T23:41:09.423 に答える