8

@startdate と @enddate といういくつかのパラメーターを受け入れる spGetOrders というストアド プロシージャがあります。これは「Orders」テーブルをクエリします。テーブルの列の 1 つは「ClosedDate」と呼ばれます。注文がクローズされていない場合、この列は NULL を保持し、クローズされている場合は日付値を保持します。ビット値を取る @Closed パラメータを追加したいと思います。単純な世界では、私はできるだろう..

select * from orders o
where o.orderdate between @startdate AND @enddate
and (if @Closed = 1 then o.ClosedDate IS NULL else o.ClosedDate IS NOT NULL)

明らかに、それはうまくいきません..私は最後の手段である動的SQLも見ていますが、答えのように見え始めています..

助けてください..

4

4 に答える 4

14

これを試して:

select * from orders o
where o.orderdate between @startdate AND @enddate
and ((@Closed = 1 And o.ClosedDate IS NULL) Or (@Closed = 0 And o.ClosedDate IS NOT NULL))

where 句で AND と OR を混在させないように注意してください。これを行うとき、評価の順序を制御する括弧は非常に重要です。

于 2008-12-09T16:48:05.440 に答える
2

SQL ステートメント:

SELECT *  
FROM orders  
WHERE orderdate BETWEEN @startdate AND @enddate  
AND (@Closed = 1 OR CLosedDate IS NOT NULL)
于 2008-12-09T16:46:56.363 に答える
0

またはこれ:

select * from orders o
where o.orderdate between @startdate AND @enddate
and (  (@Closed = 1 AND o.ClosedDate IS NULL)
     OR (ISNULL(@Closed, 0) <> 1 AND o.ClosedDate IS NOT NULL)
     )

終値情報が矛盾する 2 つの日付間のすべての注文が必要なようです。他の提案はおそらく同じ (またはそれ以上) ですが、これが機能し、読みやすいと確信しています (他の提案のほとんどは、入力中に表示されました)。

幸運を!

于 2008-12-09T16:48:32.773 に答える
0

基本、書き出します。

select * from orders o
where o.orderdate between @startdate AND @enddate
and ((@Closed = 1 and o.ClosedDate IS NULL)
    or (@Closed != 1 and o.ClosedDate IS NOT NULL))

ダブル、取り外し可能

于 2008-12-09T16:50:01.133 に答える