【问题标题】:sql stored procedures and bitwise operatorssql 存储过程和位运算符
【发布时间】: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


【解决方案1】:

第二个问题:我不知道怎么做 指定我何时想要所有项目 不是服务(类别:8)

如果我理解您的问题,我认为您正在寻找按位反转位 ~

例如

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

【讨论】:

  • 是的,但是在 same 过程中,我想通过参数指定所有可能的组合:选择所有项目,选择属于一个或多个的所有项目类别,选择所有不属于一个或多个类别的项目。
【解决方案2】:

你需要

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

所有东西都不是服务 = 0x7F & ~0x08

编辑:如果您只希望前 4 件事成为标志,那么差别不大。前 4 位专为您的位比较而保留。所以你不能有任何额外的 id 需要前 4 位中的值(从右边开始)......

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

再说一遍,Ax(~Sx) = 0x3F & ~0x08

【讨论】:

  • 谢谢,但也许我的问题不够清楚:唯一可按位分类的类别是特殊类别,因此我只需要 id:1、2、4、8。其他类别是免费使用任何 id > 15.
  • 已更新,您不能拥有使用前 4 位的 id。
猜你喜欢
  • 2021-01-11
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
相关资源
最近更新 更多