3

我在我的一个变量中得到一个输入,基本上我想做类似的事情

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

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

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

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

于 2012-08-01T13:43:28.943 回答