我在我的一个变量中得到了一个输入,基本上我想做一些像
这样的事情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
但是所有这些方法都会产生错误,如果可能的话,我会很乐意提供一个好的建议,更有效的方法。
感谢您的帮助。
答案 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数据的任何位置都已针对您创建的新结构进行了优化。