如果值为空,postgresql 忽略过滤条件
Posted
技术标签:
【中文标题】如果值为空,postgresql 忽略过滤条件【英文标题】:Postgre SQL ignore the filtering condition if the value is null 【发布时间】:2020-06-05 12:01:40 【问题描述】:我将以下三个变量传递给查询A,B and C
。
A、B 和 C 可以取任何值,包括 null。
当我运行以下查询集时,如果 A、B 或 C 中的值为 null,它应该忽略条件
queryset = User.objects.values().filter(A_name=A, B_name=B, C_name =C)
例如,如果 C 值传入 null,那么查询的行为应该像
queryset = User.objects.values().filter(A_name=A, B_name=B)
如果 C 和 A 值传入 null,那么查询的行为应该像
queryset = User.objects.values().filter(B_name=B)
我不想写下所有 9 个组合并写一个查询。有什么方法可以轻松做到吗?
【问题讨论】:
【参考方案1】:首先,创建您自己的Custom Model Manager
class MyManager(models.Manager):
def custom_filter(self, *args, **kwargs):
filtered_kwargs = key: value for key, value in kwargs.items() if value
return super().filter(*args, **filtered_kwargs)
然后在你的模型中连接起来,
class MyModel(models.Model):
objects = MyManager()
# other model fields
现在,将您的查询集过滤为,
queryset = User.objects.values()<b>.custom_filter(</b>A_name=A, <b>B_name=SomeNullValue</b>)
【讨论】:
【参考方案2】:您可以将参数保留为 dict 并仅将不等于 None 的参数发送到 filter() 方法:
arguments = "A_name": A, "B_name": B, "C_name": C
arguments_without_null = k: v for k, v in arguments.items() if v is not None
queryset = User.objects.values().filter(**arguments_without_null)
【讨论】:
以上是关于如果值为空,postgresql 忽略过滤条件的主要内容,如果未能解决你的问题,请参考以下文章
XStream将java对象解析为xml字符串时,过滤掉节点值为空的节点
oracle 查询条件中判断两个字段相等时 一个字段为空则跳过