【发布时间】:2011-06-06 14:52:51
【问题描述】:
我有一个类别表:
id;description;special
----------------------
1;Spares;TRUE
2;Accessories;TRUE
4;Consumables;TRUE
8;Services;TRUE
11;Printer;FALSE
12;Monitor;FALSE
13;Other;FALSE
special 字段指定具有固定 id 且无法删除或修改的特殊类别。我已经为这些分配了按位 OR-able 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,因此如果我只想选择消耗品,我也会得到显示器!
第二个问题: 我不知道如何指定何时需要所有不是服务的项目(类别:8)。
【问题讨论】:
-
如果你想按位计算,为什么要使用 11、12 和 13 作为 id?这些不应该是 2 的幂吗?
-
我只想按位显示特殊类别,而不是其他所有类别。
-
如果您按位使用,它们需要互斥......所以您不能有重叠的可能性。现在,打印机看起来像是一项带有耗材的服务。您需要 2 个字节才能正确表示这一点。 0x01 - 备用到 0x40 其他
标签: mysql sql stored-procedures bitwise-operators