У меня есть запрос, который должен возвращать результаты, которые НЕ совпадают в подзапросе. Подзапрос может вернуть пустой результат, поэтому мне нужно установить значение по умолчанию (скажем, 0), если подзапрос возвращает пустой набор, чтобы предотвратить IN (NULL)
, который всегда возвращает другой NULL.
Например
SELECT * FROM example_table WHERE id NOT IN (subquery_that_selects_ids)
subquery_that_selects_ids
может вернуть набор целых чисел, то есть (1,2,5,6)
или пустой набор, если подзапрос не находит подходящих результатов.
COALESCE
здесь не работает, так как подзапрос, скорее всего, вернет более одного результата.
Решения должны работать в SQLite или postgresql.
Как я могу запретить подзапросу возвращать пустой набор?
Все говорят мне, что запрос должен работать как написано. И вы все правы. Запрос строится AREL Rails3, так как я собирался опубликовать полный запрос здесь, я заметил, что AREL вставляет NULL для пустого набора при использовании условий массива.
т.е. Мой запрос в рельсах выглядел так:
Object.where("id NOT IN (?)", Object.where(other_conditions).select(:id))
когда Object.where(other_conditions)
оценивается как []
, ?
заменяется на NULL
Поэтому я переписываю запрос так:
Object.where("id NOT IN (" + Object.where(other_conditions).select(:id).to_sql + ")")
Проблема решена.
Я отдаю должное @Michael Buen, но также голосую за любого, кто сказал мне, что запрос будет работать как написано, поскольку они верны. Благодаря @OMG Ponies и @Ted Elliott особенно!