SQL: как ВЫБРАТЬ по значению, если значение может быть нулевым

У меня есть таблица базы данных "Категория", которая может иметь ссылку на себя. Если ссылка на себя имеет значение null, то это категория верхнего уровня (без родителя). Если он указывает на другую категорию, это подкатегория данной категории.

Теперь я пытаюсь настроить запрос, который возвращает все подкатегории с заданным идентификатором родительской категории. Что-то вроде следующего (синтаксис Android Room):

"SELECT * FROM category WHERE parent_id = :parentId"

Этот запрос ничего не возвращает, если parentId == null, но я хотел бы, чтобы он возвращал все категории, где parentId == null (т.е. категории верхнего уровня). С запросом

"SELECT * FROM category WHERE parent_id IS NULL"

Я могу успешно получить родительские категории, но, очевидно, это не работает для подкатегорий.

Я также попробовал следующий запрос

"SELECT * FROM category WHERE (parent_id IS NULL OR parent_id = :parentId)

но это, конечно, терпит неудачу, поскольку всегда возвращает категории верхнего уровня, хотя намерение состоит в том, чтобы получить только определенный набор подкатегорий.

Мой вопрос в том, как я могу настроить свой запрос так, чтобы он работал должным образом, т.е. возвращал все категории верхнего уровня, когда parentId == null, в противном случае он возвращает все подкатегории данного идентификатора категории.


person m5seppal    schedule 03.06.2018    source источник


Ответы (2)


Стандарт SQL требует такой обработки значений NULL.

Но у SQLite есть расширение: вы можете использовать IS и со значениями, отличными от NULL:

SELECT * FROM category WHERE parent_id IS :parentId
person CL.    schedule 03.06.2018
comment
Извините за поздний ответ, это работает. Большое спасибо! - person m5seppal; 17.06.2018

Я думаю, вам просто нужно немного более сложное условие:

SELECT c.*
FROM category c
WHERE (c.parent_id IS NULL AND :parentId IS NULL) OR
      (parent_id = :parentId);
person Gordon Linoff    schedule 03.06.2018
comment
Я пробовал это, но не мог заставить это работать. Ответ от КЛ. работал. - person m5seppal; 17.06.2018