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

What is the proper syntax for an Ecto query using ilike and SQL concatenation?

我正在尝试进行 Ecto 查询,在其中连接给定查询结果的名字和姓氏,然后使用查询字符串执行 ilike 搜索。例如,我可能想在数据库中搜索所有以“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)

我得到了正确的功能。

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

我认为在你的情况下我只会使用 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_namelast_name 之间包含 space。此外,我在绑定之前将 % 个字符添加到搜索查询中。