如何评估WHERE子句中的输入

时间:2012-07-31 02:49:15

标签: sql sql-server-2008 tsql

我在我的一个变量中得到了一个输入,基本上我想做一些像

这样的事情
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

但是所有这些方法都会产生错误,如果可能的话,我会很乐意提供一个好的建议,更有效的方法。

感谢您的帮助。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

但你不应该使用它,除非你故意想隐瞒你的代码!

答案 2 :(得分:0)

不要过多地混淆这个问题,但我会很快指出,在我看来,当他提出一个新专栏时,科里是在正确的轨道上,但我能理解你并不总是有自由改变你的数据结构。

但是,如果我无法更改我的数据结构,我仍然希望以这样的方式制作我的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

但实际上我只是喜欢使用CROSS APPLY。

这样做的好处是,如果您想重新使用该条件逻辑(例如添加SELECT pInfo.ItemCode,甚至GROUP BY pInfo.ItemCode),那么它们都包含在一个地方。

此外,如果您确实添加了Cory提到的那个列,那么查询中您使用ItemCode数据的任何位置都已针对您创建的新结构进行了优化。