0

ユーザーが任意の検索基準を入力して送信できる注文検索ページがあります。クリックが基準を入力せずに送信された場合、すべての注文を表示する必要があります。ユーザーが orderId を入力すると、それぞれの注文のみが表示されます。ユーザーが日付範囲とステータスを入力すると、選択した日付範囲で選択したステータスの注文が表示されます。

表示通りにしてみました。

SELECT * FROM dbo.Orders
WHERE ( OrderNumber ='' OR OrderNumber ='212' )
AND ( (OrderDate BETWEEN '2010-01-01' AND '2012-10-10') 
OR (OrderDate BETWEEN '' AND '')  )
4

3 に答える 3

0

これは非常に単純なクエリ
です。declare @ordernumber int = null
SELECT * FROM dbo.Orders
WHERE
(@ordernumber is null or (OrderNumber IS NOT NULL AND OrderNumber IN (@ordernumber)))
AND ( (OrderDate BETWEEN '2010-01-01 ' AND '2012-10-10') OR (OrderDate BETWEEN '' AND '') )

このクエリは単純ですが、ここで説明します。@ordernumber が null の場合はすべてのレコードが表示され、それ以外の場合は渡された orderid に対応するレコードのみが表示されます。

于 2012-07-19T07:06:44.117 に答える
0

Erland のこの完全な記事、特に「 Umachandar's Bag of Tricks」という見出しを確認してください。

動的WHERE句の実装も確認してください

これを達成するために COALESCE を利用する方法を示す上記の記事からの抜粋:

DECLARE @Cus_Name varchar(30),
                  @Cus_City varchar(30),
                  @Cus_Country varchar(30)

SET @Cus_Name = NULL
SET @Cus_City = 'Paris'
SET @Cus_Country = NULL

SELECT Cus_Name,
               Cus_City,
               Cus_Country
FROM Customers
WHERE Cus_Name = COALESCE(@Cus_Name,Cus_Name) AND
      Cus_City = COALESCE(@Cus_City,Cus_City) AND
      Cus_Country = COALESCE(@Cus_Country,Cus_Country)
于 2012-07-19T02:14:03.557 に答える
0

フィールドに値があるかどうか、およびフィールドに値がないかどうかを確認することはできません。関係なく、常にすべてのレコードを取得します。値を変数に取り出す必要があります。動的 SQL を作成している場合を除きます。その場合は、フィルタリングする場合にのみ where 句に追加します...

DECLARE @OrderNumber VARCHAR, @StartDate VARCHAR, @EndDate VARCHAR

SET @OrderNumber = '212'
SET @StartDate = '2010-01-01'
SET @EndDate = '2012-01-01'

SELECT  * 
FROM    dbo.Orders 
WHERE   (@OrderNumber ='' OR OrderNumber = @OrderNumber) 
AND     (@StartDate = '' OR OrderDate >= @StartDate)
AND     (@EndDate = '' OR OrderDate <= @EndDate)
于 2012-07-19T00:35:48.070 に答える