我有一个查询需要返回子查询中不匹配的结果。子查询可以返回一个空结果,所以如果子查询返回一个空集,我需要设置一个默认值(比如 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 中运行。如何防止子查询返回空集?
每个人都告诉我查询应该按书面方式工作。你们都是对的。该查询是由 Rails3 的 AREL 构建的,当我准备在这里发布完整的查询时,我注意到 AREL 在使用数组条件时将 NULL 放入空集。
IE 我在 rails 中的查询看起来像:
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!