2011-06-06 141 views
1

我有一個類別表:SQL存儲過程和位運算符

id;description;special 
    ---------------------- 
    1;Spares;TRUE 
    2;Accessories;TRUE 
    4;Consumables;TRUE 
    8;Services;TRUE 
    11;Printer;FALSE 
    12;Monitor;FALSE 
    13;Other;FALSE 

特殊字段指定特殊類別具有固定ID和不能被刪除,也不修改。我已經爲這些分配了按位或可用的ID。

然後我有項目,每個項目屬於一個類別(1:n的關係)。

現在,我想寫入的存儲過程需要含有id的OR-ED組合的輸入參數:

1 I want spare parts 
2 I want accessories 
4 I want consumables 
**5 I want consumables AND spare parts** 

如果該參數爲NULL,則希望每個項目,無論其類別。

這是很容易的,說的參數被稱爲_or_category,那麼WHERE條款可能是這樣的:

SELECT 
    * 
FROM 
    items I 
JOIN 
    categories C ON (C.id = I.category) 
WHERE 
    (_or_category IS NULL) OR (C.special = TRUE AND C.id | _or_categoria = _or_categoria) 
; 

第一個問題: * 編輯:對不起,這不是一個問題,因爲我在WHERE子句中有C.special = TRUE。 * 類別12可以「看到」爲id = 8或4,因此如果我只想選擇易損件,我也可以看到顯示器!

第二個問題: 我不知道如何指定何時需要所有不是服務的項目(cat:8)。

+0

如果要逐位這些,爲什麼你用11,12和13作爲ID?這不應該是2的權力嗎? – LJM 2011-06-06 14:59:41

+0

我只想按位分類的特殊類別,而不是所有其他。 – vulkanino 2011-06-06 15:01:04

+0

如果你使用按位,他們需要互斥......所以你不能有重疊的可能性。現在,打印機看起來像一個耗材服務。您需要2個字節才能正確表示。 0x01 - 備用到0x40其他 – FlyingStreudel 2011-06-06 15:53:58

回答

1

問題二:我不知道該怎麼 指定時,我想所有的項目 這是不是一種服務(貓:8)

如果我理解你的問題,我想你」重新尋找按位取反位~

例如

C.special = TRUE AND (~C.ID | or_categoria = _or_categoria) 
+0

這是真的,但在**相同**過程中,我想通過參數指定所有可能的組合:選擇所有項目,選擇屬於一個或多個類別的所有項目,選擇全部該項目不屬於一個或多個類別。 – vulkanino 2011-06-07 07:48:01

1

你需要

0x01 - Spares 
0x02 - Accessories 
0x04 - Consumables 
0x08 - Services 
0x10 - Printer 
0x20 - Monitor 
0x40 - Other 

萬物沒有服務= 0x7F & ~0x08

編輯:如果你只想要第4件事情是它的標誌是沒有太大的不同。前4位僅用於比較比較。所以,你不能有任何額外的IDS,要求是在第4位(右一)的值...

0x01 - Spares 
0x02 - Accessories 
0x04 - Consumables 
0x08 - Services 
0x10 - Printer 
0x20 - Monitor 
0x30 - Other 

再次,Ax(~Sx) = 0x3F & ~0x08

+0

謝謝,但也許我的問題還不夠清楚:唯一可以按位劃分的類別是特殊類別,所以我只需要id:1,2,4,8。其他類別可以自由使用任何id> 15 – vulkanino 2011-06-07 07:46:15

+0

更新,你只是不能有使用前4位的id。 – FlyingStreudel 2011-06-07 14:12:12