使用 ilike 和 SQL 连接的 Ecto 查询的正确语法是什么?

问题描述 投票:0回答:1

我正在尝试进行 Ecto 查询,其中连接给定查询结果的名字和姓氏,然后使用查询字符串执行类似搜索。例如,我可能想在数据库中搜索所有以“Bob J”开头的姓名。目前,我的代码如下所示:

pending_result_custom_search = from result in pending_result_query,
         where: ilike(fragment("CONCAT(?, '',?)", result.first_name, result.last_name), ^query)

(pending_result_query 是我之前编写的查询)

这种方法不起作用,我继续得到一个空的查询集。如果我执行这样的查询

query = "Bob"
pending_result_custom_search = from result in pending_result_query,
         where: ilike(fragment("CONCAT(?, '',?)", "%Bob%", ""), ^query)

我获得了正确的功能。

使第一种方法正常工作的正确语法是什么?

sql elixir phoenix-framework ecto
1个回答
2
投票

我认为在你的情况下我只会使用

fragment
,例如

query = "%" <> "Bob" <> "%"
pending_result_custom_search = from result in pending_result_query,
         where: fragment("first_name || last_name ILIKE ?", ^query)

这样你就可以将焦点转移到 PostGres 并使用它的函数,而不用过多担心它们的 Ecto 抽象。在上面的示例中,我使用

||
来连接列值,但如果需要,您可以使用 PostGres 的
CONCAT()

pending_result_custom_search = from result in pending_result_query,
         where: fragment("CONCAT(first_name, last_name) ILIKE ?", ^query)

请注意,此处的两个示例在

first_name
last_name
之间均不包含空格。另外,我在绑定之前将
%
字符添加到搜索查询中。

© www.soinside.com 2019 - 2024. All rights reserved.