在 WHERE 子句中使用函数编写 SQL SELECT 语句是不是有 Django 等效项?

Posted

技术标签:

【中文标题】在 WHERE 子句中使用函数编写 SQL SELECT 语句是不是有 Django 等效项?【英文标题】:Is there a Django equivalent for writing a SQL SELECT statement with a function in the WHERE clause?在 WHERE 子句中使用函数编写 SQL SELECT 语句是否有 Django 等效项? 【发布时间】:2020-09-17 11:32:24 【问题描述】:

我有一系列带有插入(“-”字符)的蛋白质序列比对需要删除,以便我可以在序列中搜索模式。

我可以使用以下 SQL 查询来做到这一点:

select sequence
from sequences
where replace(sequences.sequence,"-","") like "%"+pattern+"%"

    据我了解,在查询中进行替换和模式匹配应该比遍历每个序列并在 python 中进行替换和模式匹配更有效。这是正确的吗?

    如果 #1 是正确的,是否存在与该查询等效的 Django?

【问题讨论】:

【参考方案1】:

是的,您可以通过以下方式使用Replace expression [Django-doc]:

from django.db.models import Value
from django.db.models.functions import Replace

Sequence.objects.annotate(
    replaced=Replace('sequence', Value('-'), Value(''))
).filter(
    replaced__icontains=pattern
)

确实比获取所有记录并在 Django/Python 级别进行过滤更有效,但这仍然会导致线性搜索时间,效率不高。

如果您能以某种方式用连字符“准备”模式,从而删除数据库的 Replace 部分,可能会更好。

【讨论】:

以上是关于在 WHERE 子句中使用函数编写 SQL SELECT 语句是不是有 Django 等效项?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WHERE 子句中编写带有 SELECT 语句的 SQL DELETE 语句?

为啥聚集函数不能出现在where子句中

使用 SQL Server 2008 在 WHERE 子句中使用 SUBSTRING 函数 [重复]

如何在 SQL Server where 子句中使用表值函数

如何使用 WHERE x IN 子句为 PreparedStatement 编写 SQL?

在 WHERE 子句中使用类似 WINDOW 的函数对表进行 SQL 更新