0

我打算在 SQLAlchemy 网站上记录一个问题,但在此之前我只是想检查一下我没有错过任何东西。我在 IRC 上问过,我认为这可能是一个合法的问题。

归结为 != 过滤器没有考虑空/NULL单元格。

例如,让我们说

Session.query(Table).\
filter(Table.column != 1).all()

现在我希望这会返回值不等于 1 的所有记录。但是,它实际返回的是包含数据的记录列表,不等于 1。

因此,例如,如果列是 NULL/空值,则此查询不会返回它,而我(和其他人)期望它会返回。

现在显然在创建列时使用 NOT NULL 是最佳实践,但我只是想看看是否有解决此问题的方法,或者是否值得提交错误

4

1 回答 1

0

好吧,这与 SQLAlchemy 无关,它只是 NULL 的滚动方式。NULL != 1既不是真也不是假,它的计算结果为 NULL。因此,WHERE 子句不会为该列返回任何具有 NULL 值的行。

您可以选择以下任何一种:

Session.query(Table).filter(or_(
    Table.column == None,
    Table.column != 1,
))

或类似的东西:

Session.query(Table).filter(
    func.coalesce(Table.column, -1) != 1)

将 NULL 值转换为可用于比较的值,-1 != 1评估结果为 true。

于 2013-03-04T11:58:30.280 回答