0

以下はサンプルテーブルのスクリプトです

DECLARE @tbl TABLE (ID int)
INSERT INTO @tbl VALUES(1), (2), (NULL), (3), (NULL), (1)

列に3つの条件が必要ですID

SELECT * FROM @tbl WHERE ID -- Can't figure out
  1. ユーザーがすべての行を必要とする場合
  2. ユーザーがIDがNULLの行が必要な場合
  3. ユーザーがIDがNULLでない行が必要な場合

クエリを文字列に入れることでこれを行うことができますが、長いクエリではこのような条件が1つしかないため、すべてのクエリを文字列に入れたくありません。

編集:@TimSchmelterへの返信。私の主張を明確にすることができなかったことをお詫びします。ユーザーはフロントエンドから、IDが指定されている行のみをすべての行にするか、IDが指定されていない行をすべての行にするかを選択します。

長いクエリでは、1つの条件は次のようになります

@id INT // Value from front end like 'All', 'Products', 'No Products'
WHERE ID = @ID // Here I can't figure out that how to use one of three conditions

それでも質問を説明できない場合はお知らせください。もう一度やり直します。

ありがとう。

4

2 に答える 2

3

たぶん私はあなたの要件を誤解しました、それは簡単ではありませんか?

-- 1.) If User want all rows 
SELECT * FROM @tbl 

-- 2.) If user want rows where ID is NULL
SELECT * FROM @tbl 
WHERE ID IS NULL

-- 3.) If user want rows where ID is NOT NULL
SELECT * FROM @tbl 
WHERE ID IS NOT NULL 

編集:パラメータを使用してそれに応じてフィルタリングしたいので、見てみましょう:

SELECT * FROM @tbl 
WHERE   @FilterID = 1                      -- returns all rows
OR    ( @FilterID = 2 AND ID IS NULL)      -- returns all null-rows
OR    ( @FilterID = 3 AND ID IS NOT NULL)  -- returns all not null rows

推奨されていませんCASEが、where句で使用することもできます。

于 2012-05-24T10:55:35.440 に答える
0

選択肢(ラジオボタンなど)をユーザーに提示してから、選択したオプションの値を次のようにデータベースに渡すことができます。

SELECT * FROM @tbl 
WHERE 
   (@Option = 1)
   OR (@Option = 2 AND ID IS NULL)
   OR (@Option = 3 AND ID IS NOT NULL)

または、パフォーマンスを低下させる可能性がありますが、SQL Server(またはそのことについては任意のRDBMS)は短絡しません。多少の短絡を強制する可能性がある場合

SELECT * FROM @tbl 
WHERE 
   CASE @Option
   WHEN 1 THEN 1
   WHEN 2 THEN 
          CASE WHEN ID IS NULL THEN 1 END
   WHEN 3 THEN
          CASE WHEN ID IS NOT NULL THEN 1 END
   END = 1
于 2012-05-24T11:00:51.590 に答える