2011-06-06 145 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