None/NULL 值的 SQLAlchemy 过滤器 - 工作 - 但如何将它放在列表中?
SQLAlchemy filter for None/NULL Value - WORKS - but how to have it in_ a list?
我想针对 None
或 MySQL 方言 NULL
列中的值过滤我的数据。
这很容易完成:
db.query(models.Data).filter(models.Data.multiplier == None).all()
好吧,但我正在构建一种高级筛选和排序功能。因此,我有一个包含要过滤的值的列表,例如:
[1,2,5]
为此过滤我的数据也很容易:
db.query(models.Data).filter(models.Data.multiplier.in_([1,2,5])).all()
但现在我还想在我的列表中允许 None
值:
[1,2,5,None]
过滤:
db.query(models.Data).filter(models.Data.multiplier.in_([1,2,5,None])).all()
但是,multiplier
列中具有 NULL
值的所有行都 NOT 返回。为什么 None
不能与 in_
函数一起使用?如何解决?
NULL
doesn't compare as equal to NULL,所以
SELECT bar
FROM foo
WHERE bar IN (1, 2, 3 , NULL)
将 return 行,其中 bar
是 1
或 2
或 3
但如果 bar
是 NULL
.
相反,您需要提供 NULL
案例作为 IN
案例的替代方案。
SELECT bar FROM foo WHERE bar IN (1, 2, 3) OR bar IS NULL
或者用 SQLAlchemy 术语来说
import sqlalchemy as sa
...
result = (session.query(Foo)
.filter(
sa.or_(
Foo.bar.in_([1, 2, 3]),
Foo.bar == None
)
)
)
您可以使用 is_()
column operator 使用 None
进行比较(以匹配 NULL
)。要检查列是否不是 NULL
,您可以使用 is_not
.
如:
result = Foo.filter(
sa.or_(
Foo.bar.in_([1,2,3]),
Foo.bar.is_(None)
)
)
但是,是的,当您使用 in_ 进行过滤时,请听 snakecharmerb。
我想针对 None
或 MySQL 方言 NULL
列中的值过滤我的数据。
这很容易完成:
db.query(models.Data).filter(models.Data.multiplier == None).all()
好吧,但我正在构建一种高级筛选和排序功能。因此,我有一个包含要过滤的值的列表,例如:
[1,2,5]
为此过滤我的数据也很容易:
db.query(models.Data).filter(models.Data.multiplier.in_([1,2,5])).all()
但现在我还想在我的列表中允许 None
值:
[1,2,5,None]
过滤:
db.query(models.Data).filter(models.Data.multiplier.in_([1,2,5,None])).all()
但是,multiplier
列中具有 NULL
值的所有行都 NOT 返回。为什么 None
不能与 in_
函数一起使用?如何解决?
NULL
doesn't compare as equal to NULL,所以
SELECT bar
FROM foo
WHERE bar IN (1, 2, 3 , NULL)
将 return 行,其中 bar
是 1
或 2
或 3
但如果 bar
是 NULL
.
相反,您需要提供 NULL
案例作为 IN
案例的替代方案。
SELECT bar FROM foo WHERE bar IN (1, 2, 3) OR bar IS NULL
或者用 SQLAlchemy 术语来说
import sqlalchemy as sa
...
result = (session.query(Foo)
.filter(
sa.or_(
Foo.bar.in_([1, 2, 3]),
Foo.bar == None
)
)
)
您可以使用 is_()
column operator 使用 None
进行比较(以匹配 NULL
)。要检查列是否不是 NULL
,您可以使用 is_not
.
如:
result = Foo.filter(
sa.or_(
Foo.bar.in_([1,2,3]),
Foo.bar.is_(None)
)
)
但是,是的,当您使用 in_ 进行过滤时,请听 snakecharmerb。