3

変数の1つに入力を取得していて、基本的に次のようなことをしたい

SELECT * FROM PEOPLE
WHERE 
     IF @INPUT = 1
         ITEMID = 16 OR ITEMID = 13
     ELSE IF @INPUT = 2
         ITEMID = 11 OR ITEMID = 14
     ELSE
         ITEMID = 0

これを行う方法はありますか?これが間違っている場合はご容赦ください。しかし、私は自分の問題をできるだけ簡単に理解できるように表現したいと思いました。

この前にCASEで試してみました

WHERE 
    CASE @INPUT
       WHEN 1 THEN ITEMID = 16 OR ITEMID = 13
       WHEN 2 THEN ITEMID = 11 OR ITEMID = 14
       ELSE ITEMID = 0
    END

しかし、これらのアプローチはすべてエラーをスローします。可能であれば、これを行うための良いアドバイス、より効率的な方法をいただければ幸いです。

お手伝いありがとう。

4

3 に答える 3

6
 WHERE (@INPUT = 1 AND ITEMID IN (13,16)) 
    OR (@INPUT = 2 AND ITEMID IN (11,14))
    OR (@INPUT NOT IN (1,2) AND ITEMID = 0)
于 2012-07-31T02:54:10.580 に答える
1

別の答えを与えるためだけに..

WHERE (@INPUT in (1,2) AND ITEMID+2*@INPUT IN (15,18))
OR (@INPUT NOT IN (1,2) AND ITEMID = 0)

また

WHERE (@INPUT in (1,2) AND ITEMID IN (15-2*@INPUT,18-2*@INPUT))
OR (@INPUT NOT IN (1,2) AND ITEMID = 0)

いつのために動作し@input = 1ます:

  • if ITEMID = 13, ITEMID + 2*1 = 15
  • if ITEMID = 16, ITEMID + 2*1 = 18

そしていつ@input = 2

  • if ITEMID = 11, ITEMID + 2*2 = 15
  • if ITEMID = 14, ITEMID + 2*2 = 18

ただし、意図的にコードを隠したい場合を除いて、これを使用しないでください。

于 2012-07-31T03:27:25.600 に答える
0

問題をあまり曖昧にしないでください。しかし、私の見解では、Coryが新しいコラムを提案したとき、正しい方向に進んでいることをすぐに指摘しますが、あなたが常にあなたのデータ構造。

ただし、データ構造を変更できない場合でも、作業に最適な構造を持っているかのようにSELECTステートメントを作成することをお勧めします。

このために、APPLYを使用して、WHERE句またはSELECT句で参照できる派生列を追加する傾向があります。

例えば:

SELECT
    *
FROM People p
    CROSS APPLY (
        SELECT
            CASE
                WHEN p.ItemID IN (13,16) THEN 1
                WHEN p.ItemID IN (11,14) THEN 2
                ELSE 0
            END        AS ItemCode
    ) pInfo
WHERE
    @Input = pInfo.ItemCode

しかし、本当に私はCROSSAPPLYを使いすぎるのが好きです。

これには、条件付きロジックを再利用したい場合(たとえば、を追加SELECT pInfo.ItemCodeしたり、さらにはGROUP BY pInfo.ItemCode)、すべてが1か所に含まれるという利点があります。

さらに、Coryが言及したその列を追加した場合、ItemCodeデータを使用したクエリ内の場所は、作成した新しい構造に対してすでに最適化されています。

于 2012-08-01T13:43:28.943 に答える