2012-07-31 83 views
3

我正在輸入我的變量之一,基本上我想要做這樣的事情如何在WHERE子句

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

通常我會盡量避免在查詢中像這樣硬編碼ID。 13和16或者11和14有什麼特別之處?他們可以自己成爲一個類別還是一個組?也許你的表需要一個新的列來標識元素組 - 你可以這樣簡化你的查詢。在維護方面考慮一下 - 你是否真的想維護這些硬編碼的ID? – 2012-07-31 02:58:16

回答

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

這在我的手機上打字令人驚訝。 – LittleBobbyTables 2012-07-31 02:59:36

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

但你不應該使用這個,除非您有意掩蓋你的代碼!

+1

作品 - 但嘗試維護/修復該代碼從現在起八個月....甚至不*你*將記住什麼代碼是關於什麼...... – 2012-07-31 04:59:09

+2

因此,我的評論,這應該永遠不會被使用,雖然我剛剛添加的第二個選項(這是更不可讀)可能更有效:) – AlexDev 2012-07-31 08:57:11

+1

同意@marc_s,但如果性能是一個問題,這個技巧確實有幫助,我不明白爲什麼它不能使用如果沒有更快的選擇。 *但是*這種代碼只是**應該被評論**(例如,可以指定更可讀的過濾器版本,以便爲後續維護者提供想法)。 – 2012-08-02 07:38:34

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數據的查詢中的任何位置都已針對您創建的新結構進行了優化。