У меня есть таблица категорий:
id;description;special
----------------------
1;Spares;TRUE
2;Accessories;TRUE
4;Consumables;TRUE
8;Services;TRUE
11;Printer;FALSE
12;Monitor;FALSE
13;Other;FALSE
Специальное поле обозначает специальные категории, которые имеют фиксированные идентификаторы и не могут быть удалены или изменены. Я назначил для них побитовые OR-способные идентификаторы.
Тогда у меня есть предметы, каждый предмет относится к категории (с отношением 1: n).
Теперь я хотел бы написать хранимую процедуру, которая принимает входной параметр, содержащий комбинацию идентификаторов OR-ed:
1 I want spare parts
2 I want accessories
4 I want consumables
**5 I want consumables AND spare parts**
и т.д.
Если параметр НЕДЕЙСТВИТЕЛЕН, тогда я хочу каждый элемент независимо от его категории.
Это довольно просто, скажем, параметр называется _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)
;
Первая проблема:
* edit: извините, это не проблема, поскольку в предложении WHERE указано C.special = TRUE. *
категорию 12 можно «увидеть» как id = 8 ИЛИ 4, поэтому, если я хочу выбрать только расходные материалы, я бы также получил мониторы!
Вторая проблема:
Я не знаю, как указать, когда мне нужны все элементы, которые НЕ являются услугами (cat: 8).